/ Hex Artifact Content
Login

Artifact 2ccb1152741996d3f6125232f14dfcf654bdd29f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 36 32  : pager.c,v 1.62
0350: 31 20 32 30 30 39 2f 30 37 2f 32 35 20 31 31 3a  1 2009/07/25 11:
0360: 34 30 3a 30 38 20 64 61 6e 69 65 6c 6b 31 39 37  40:08 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1120: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1130: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1140: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1150: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1160: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1170: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1180: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1190: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
11a0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
11b0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
11c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
11d0: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
11e0: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
11f0: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
1200: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
1210: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
1220: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
1230: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
1240: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1250: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
1260: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
1270: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1280: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
1290: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
12a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
12b0: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
12c0: 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49 66  r size. 16MB. If
12d0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
12e0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
12f0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
1300: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
1310: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
1320: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
1330: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
1340: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
1350: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
1360: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
1370: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
1380: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
1390: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
13a0: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
13b0: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
13c0: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
13d0: 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a 2f  IZE 0x0100000../
13e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
13f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1400: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
1410: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
1420: 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65  h active.** save
1430: 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d  point and statem
1440: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1450: 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41  in the system. A
1460: 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72  ll such structur
1470: 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  es.** are stored
1480: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
1490: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
14a0: 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63  , which is alloc
14b0: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69  ated and.** resi
14c0: 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zed using sqlite
14d0: 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3Realloc()..**.*
14e0: 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  * When a savepoi
14f0: 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74  nt is created, t
1500: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
1510: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
1520: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
1530: 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d  0. If a journal-
1540: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1550: 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  n into the main 
1560: 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a  journal while.**
1570: 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
1580: 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69  s active, then i
1590: 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
15a0: 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66   to the byte off
15b0: 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  set .** immediat
15c0: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
15d0: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72  e last journal r
15e0: 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e  ecord written in
15f0: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  to the main.** j
1600: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68  ournal before th
1610: 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
1620: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
1630: 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f  ed during savepo
1640: 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  int.** rollback 
1650: 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61  (see pagerPlayba
1660: 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a  ckSavepoint())..
1670: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1680: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1690: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b   PagerSavepoint;
16a0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76  .struct PagerSav
16b0: 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69  epoint {.  i64 i
16c0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
16d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
16e0: 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61  ing offset in ma
16f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
1700: 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20  i64 iHdrOffset; 
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1720: 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42  See above */.  B
1730: 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f  itvec *pInSavepo
1740: 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  int;        /* S
1750: 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  et of pages in t
1760: 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f  his savepoint */
1770: 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20  .  Pgno nOrig;  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62  /* Original numb
17a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66  er of pages in f
17b0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53  ile */.  Pgno iS
17c0: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
17d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17e0: 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  f first record i
17f0: 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  n sub-journal */
1800: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
1810: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
1820: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1830: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1840: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72  ucture..**.** er
1850: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61  rCode.**.**   Pa
1860: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
1870: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1880: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
1890: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20  ORRUPT, or.**   
18a0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20  or SQLITE_FULL. 
18b0: 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  Once one of the 
18c0: 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f  first three erro
18d0: 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65  rs occurs, it pe
18e0: 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20  rsists.**   and 
18f0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74  is returned as t
1900: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65  he result of eve
1910: 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41  ry major pager A
1920: 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a  PI call.  The.**
1930: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72     SQLITE_FULL r
1940: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
1950: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
1960: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
1970: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
1980: 20 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75    next successfu
1990: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
19a0: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
19b0: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
19c0: 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55  ,.**   SQLITE_FU
19d0: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
19e0: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
19f0: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
1a00: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1a10: 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65  ).**   APIs, the
1a20: 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75  y may still be u
1a30: 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  sed successfully
1a40: 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61  ..**.** dbSizeVa
1a50: 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f  lid, dbSize, dbO
1a60: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
1a70: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61  ize.**.**   Mana
1a80: 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ging the size of
1a90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aa0: 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61  le in pages is a
1ab0: 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61   little complica
1ac0: 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61  ted..**   The va
1ad0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53  riable Pager.dbS
1ae0: 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ize contains the
1af0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b00: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1b10: 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75  se.**   image cu
1b20: 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
1b30: 2e 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73  . As the databas
1b40: 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72  e image grows or
1b50: 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a   shrinks this.**
1b60: 20 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75     variable is u
1b70: 70 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69  pdated. The vari
1b80: 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c  able Pager.dbFil
1b90: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
1ba0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
1bb0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1bc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1bd0: 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  is may be differ
1be0: 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64  ent from Pager.d
1bf0: 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f  bSize.**   if so
1c00: 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65  me pages have be
1c10: 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1c20: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
1c30: 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72  e but not yet wr
1c40: 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66  itten.**   out f
1c50: 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f  rom the cache to
1c60: 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1c70: 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20   on disk. Or if 
1c80: 74 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65  the image has be
1c90: 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65  en.**   truncate
1ca0: 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e  d by an incremen
1cb0: 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  tal-vacuum opera
1cc0: 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e  tion. The Pager.
1cd0: 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61  dbOrigSize varia
1ce0: 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e  ble.**   contain
1cf0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d00: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1d10: 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e  abase image when
1d20: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d30: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61    transaction wa
1d40: 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f  s opened. The co
1d50: 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68  ntents of all th
1d60: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72  ree of these var
1d70: 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f  iables is.**   o
1d80: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74  nly guaranteed t
1d90: 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20  o be correct if 
1da0: 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65  the boolean Page
1db0: 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73  r.dbSizeValid is
1dc0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54   true..**.**   T
1dd0: 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20  ODO: Under what 
1de0: 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62  conditions is db
1df0: 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43  SizeValid set? C
1e00: 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68  leared?.**.** ch
1e10: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a  angeCountDone.**
1e20: 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65  .**   This boole
1e30: 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  an variable is u
1e40: 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
1e50: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65   that the change
1e60: 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28  -counter .**   (
1e70: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
1e80: 72 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20  r field at byte 
1e90: 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
1ea0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1eb0: 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64  is .**   not upd
1ec0: 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20  ated more often 
1ed0: 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20  than necessary. 
1ee0: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73  .**.**   It is s
1ef0: 65 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20  et to true when 
1f00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1f10: 65 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  er field is upda
1f20: 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20  ted, which .**  
1f30: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
1f40: 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65   if an exclusive
1f50: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
1f60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f70: 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  le..**   It is c
1f80: 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66  leared (set to f
1f90: 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61  alse) whenever a
1fa0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1fb0: 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71   is .**   relinq
1fc0: 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61  uished on the da
1fd0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63  tabase file. Eac
1fe0: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
1ff0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2000: 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e  d,.**   The chan
2010: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
2020: 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49   is inspected. I
2030: 66 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68  f it is true, th
2040: 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75  e work of.**   u
2050: 70 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e  pdating the chan
2060: 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d  ge-counter is om
2070: 69 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75  itted for the cu
2080: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2090: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  n..**.**   This 
20a0: 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20  mechanism means 
20b0: 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  that when runnin
20c0: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
20d0: 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ode, a connectio
20e0: 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c  n .**   need onl
20f0: 79 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  y update the cha
2100: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65  nge-counter once
2110: 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  , for the first 
2120: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2130: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2140: 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a  * dbModified.**.
2150: 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66  **   The dbModif
2160: 69 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ied flag is set 
2170: 77 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62  whenever a datab
2180: 61 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74  ase page is dirt
2190: 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20  ied..**   It is 
21a0: 63 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65  cleared at the e
21b0: 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73  nd of each trans
21c0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
21d0: 49 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  It is used when 
21e0: 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74  committing or ot
21f0: 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61  herwise ending a
2200: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2210: 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69  .**   the dbModi
2220: 66 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65  fied flag is cle
2230: 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72  ar then less wor
2240: 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65  k has to be done
2250: 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53  ..**.** journalS
2260: 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54  tarted.**.**   T
2270: 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20  his flag is set 
2280: 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65  whenever the the
2290: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
22a0: 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
22b0: 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74    The point of t
22c0: 68 69 73 20 66 6c 61 67 20 69 73 20 74 68 61 74  his flag is that
22d0: 20 69 74 20 6d 75 73 74 20 62 65 20 73 65 74 20   it must be set 
22e0: 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20 20  after the .**   
22f0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
2300: 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e 61  ader in a journa
2310: 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
2320: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
2330: 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69 73 20  **   After this 
2340: 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65  has happened, ne
2350: 77 20 70 61 67 65 73 20 61 70 70 65 6e 64 65 64  w pages appended
2360: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2370: 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65   .**   do not ne
2380: 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ed the PGHDR_NEE
2390: 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c  D_SYNC flag set,
23a0: 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   as they do not 
23b0: 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69  need.**   to wai
23c0: 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  t for a journal 
23d0: 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79  sync before they
23e0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
23f0: 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  out to.**   the 
2400: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73  database file (s
2410: 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  ee function page
2420: 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20  r_write())..**  
2430: 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a   .** setMaster.*
2440: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
2450: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2460: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2470: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2480: 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28 69  ile name.**   (i
2490: 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20 77  f any) is only w
24a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
24b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 63  journal file onc
24c0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  e..**.**   When 
24d0: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
24e0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d 61  nsaction, the ma
24f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2500: 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29 0a  e name (if any).
2510: 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69 74  **   may be writ
2520: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
2530: 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 20  rnal file while 
2540: 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69  the pager is sti
2550: 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45 52  ll in.**   PAGER
2560: 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 20  _RESERVED state 
2570: 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73 65  (see CommitPhase
2580: 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61 63  One() for the ac
2590: 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20 74  tion). It.**   t
25a0: 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  hen attempts to 
25b0: 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65 78  upgrade to an ex
25c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49 66  clusive lock. If
25d0: 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a 2a   this attempt.**
25e0: 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 53     fails, then S
25f0: 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20 62  QLITE_BUSY may b
2600: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
2610: 65 20 75 73 65 72 20 61 6e 64 20 74 68 65 20 75  e user and the u
2620: 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74 74  ser.**   may att
2630: 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74  empt to commit t
2640: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  he transaction a
2650: 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c 6c  gain later (call
2660: 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74 50  ing.**   CommitP
2670: 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e 29  haseOne() again)
2680: 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 75  . This flag is u
2690: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
26a0: 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61 73  at the .**   mas
26b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
26c0: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
26d0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26e0: 66 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a 2a  file the first.*
26f0: 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74 50  *   time CommitP
2700: 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c  haseOne() is cal
2710: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74  led..**.** doNot
2720: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Sync.**.**   Thi
2730: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  s variable is se
2740: 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79  t and cleared by
2750: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2760: 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64  te()..**.** need
2770: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44  Sync.**.**   TOD
2780: 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20 65  O: It might be e
2790: 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68 69  asier to set thi
27a0: 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77 72  s variable in wr
27b0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 0a  iteJournalHdr().
27c0: 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d 61  **   and writeMa
27d0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e  sterJournal() on
27e0: 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20 6d  ly. Change its m
27f0: 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79 6e  eaning to "unsyn
2800: 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68 61  ced data.**   ha
2810: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2820: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a  o the journal"..
2830: 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f  **.** subjInMemo
2840: 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ry.**.**   This 
2850: 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72  is a boolean var
2860: 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c 20  iable. If true, 
2870: 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
2880: 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  d sub-journal.**
2890: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73 20     is opened as 
28a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
28b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66 61  rnal file. If fa
28c0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d  lse, then in-mem
28d0: 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75  ory.**   sub-jou
28e0: 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75  rnals are only u
28f0: 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  sed for in-memor
2900: 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a  y pager files..*
2910: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2920: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2930: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
2940: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
2950: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
2960: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
2970: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
2980: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
2990: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
29a0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
29b0: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
29c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
29d0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
29e0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
29f0: 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  es */.  u8 useJo
2a00: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2a10: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
2a20: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
2a30: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2a40: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a60: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
2a70: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
2a80: 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b   */.  u8 noSync;
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
2ab0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
2ac0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
2ad0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
2ae0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
2af0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
2b00: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
2b10: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
2b20: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
2b30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2b40: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
2b50: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
2b60: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
2b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
2b80: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
2b90: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
2ba0: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
2bd0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
2be0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c00: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
2c10: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
2c20: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  /..  /* The foll
2c30: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
2c40: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
2c50: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61 72   members that ar
2c60: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
2c70: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ** modified duri
2c80: 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ng normal operat
2c90: 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20  ions. The other 
2ca0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69  variables in thi
2cb0: 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  s structure.  **
2cc0: 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73   are either cons
2cd0: 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20  tant throughout 
2ce0: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20  the lifetime of 
2cf0: 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c  the pager, or el
2d00: 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  se.  ** used to 
2d10: 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74  store configurat
2d20: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74  ion parameters t
2d30: 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20 77  hat affect the w
2d40: 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20 20  ay the pager .  
2d50: 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a  ** operates..  *
2d60: 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74  *.  ** The 'stat
2d70: 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20 64  e' variable is d
2d80: 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65  escribed in more
2d90: 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69   detail along wi
2da0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63  th the.  ** desc
2db0: 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  riptions of the 
2dc0: 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61  values it may ta
2dd0: 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ke - PAGER_UNLOC
2de0: 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74  K etc. Many of t
2df0: 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61  he.  ** other va
2e00: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
2e10: 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69  block are descri
2e20: 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  bed in the comme
2e30: 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a  nt directly .  *
2e40: 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61  * above this cla
2e50: 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20  ss definition.. 
2e60: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
2e90: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
2ea0: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
2eb0: 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20   u8 dbModified; 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed0: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72  True if there ar
2ee0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
2ef0: 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20   the Db */.  u8 
2f00: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f20: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2f30: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2f40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2f50: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20  journalStarted; 
2f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f70: 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f   if header of jo
2f80: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2f90: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
2fa0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
2fb0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
2fc0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2fd0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
2fe0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3000: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
3010: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
3020: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
3030: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b  .  u8 doNotSync;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3050: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65  * Boolean. While
3060: 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70   true, do not sp
3070: 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f  ill the cache */
3080: 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69  .  u8 dbSizeVali
3090: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
30a0: 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a  * Set when dbSiz
30b0: 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a  e is correct */.
30c0: 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72    u8 subjInMemor
30d0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
30e0: 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d   True to use in-
30f0: 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e  memory sub-journ
3100: 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  als */.  Pgno db
3110: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3130: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3140: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
3150: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
3160: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
3170: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
3180: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
3190: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
31a0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
31b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
31d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
31e0: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3200: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
3210: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
3220: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3240: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
3250: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
3260: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
3270: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
3280: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3290: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
32a0: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
32b0: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
32c0: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
32f0: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
3300: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
3310: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
3320: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
3330: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3340: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3350: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
3360: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3380: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
3390: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
33a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
33b0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
33c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
33d0: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
33e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
33f0: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
3400: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
3410: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
3420: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
3430: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
3440: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3450: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
3460: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3470: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3480: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
3490: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
34a0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
34b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
34c0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
34d0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
34e0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
34f0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
3500: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
3510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3520: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3530: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
3540: 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  ] */.  char dbFi
3550: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
3560: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
3570: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
3580: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
3590: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
35a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
35b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
35c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
35d0: 62 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e  back */..  u16 n
35e0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
35f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
3600: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
3610: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
3620: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
3630: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
3640: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3650: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
3660: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
3670: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
3680: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
3690: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
36a0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
36b0: 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70  pen() */.  int p
36c0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
36d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
36f0: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  age */.  Pgno mx
3700: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
3710: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
3720: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
3730: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
3740: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
3750: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3760: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
3770: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3780: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
37b0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
37c0: 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
37d0: 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63  (void*); /* Func
37e0: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65  tion to call whe
37f0: 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64  n busy */.  void
3800: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
3810: 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  g;      /* Conte
3820: 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  xt argument for 
3830: 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
3840: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3850: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3860: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
3870: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
3880: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
3890: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
38a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
38b0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
38c0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
38d0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
38e0: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
38f0: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
3900: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
3910: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
3920: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
3930: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
3940: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
3950: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
3960: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
3970: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
3980: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
3990: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
39a0: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
39b0: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
39c0: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
39d0: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
39e0: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
3a00: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
3a10: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
3a20: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
3a30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3a40: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
3a50: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
3a60: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
3a70: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
3a80: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
3a90: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
3aa0: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
3ab0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3ac0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
3ad0: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
3ae0: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
3af0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
3b00: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
3b10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3b20: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
3b30: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
3b40: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
3b50: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
3b60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
3b70: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
3b80: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
3b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
3ba0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
3bb0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
3bc0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
3bd0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
3be0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
3bf0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
3c00: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
3c10: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
3c20: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
3c30: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
3c40: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
3c50: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3c60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
3c70: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
3c80: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
3c90: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
3ca0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
3cb0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3cc0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
3cd0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
3ce0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
3cf0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
3d00: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3d10: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
3d20: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
3d30: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
3d40: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
3d50: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
3d60: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
3d70: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
3d80: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
3d90: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
3da0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
3db0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3dc0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
3dd0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
3de0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
3df0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
3e00: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
3e10: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
3e20: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
3e30: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
3e40: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
3e50: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
3e60: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
3e70: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
3e80: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
3e90: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
3ea0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
3eb0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
3ec0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
3ed0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
3ee0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
3ef0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
3f00: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
3f10: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
3f20: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
3f30: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
3f40: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
3f50: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
3f60: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
3f70: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
3f80: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
3f90: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
3fa0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
3fb0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
3fc0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
3fd0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
3fe0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
3ff0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
4000: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
4010: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
4020: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
4030: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
4040: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
4050: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
4060: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
4070: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
4080: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
4090: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
40a0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
40b0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
40c0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
40d0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
40e0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
40f0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
4100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
4110: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
4120: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
4130: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
4140: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
4150: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
4160: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
4170: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
4180: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
4190: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
41a0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
41b0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
41c0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
41d0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
41e0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
41f0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
4200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
4210: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
4220: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
4230: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
4240: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
4250: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
4260: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
4270: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
4280: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
4290: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
42a0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
42b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
42c0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
42d0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
42e0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
42f0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
4300: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
4310: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
4320: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
4330: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
4340: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
4350: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
4360: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
4370: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
4380: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
4390: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
43a0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
43b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
43c0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
43d0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
43e0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
43f0: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
4400: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
4410: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
4420: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
4430: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
4440: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
4450: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
4460: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4470: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
4480: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
4490: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
44a0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
44b0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
44c0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
44d0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
44e0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
44f0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
4500: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
4510: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
4520: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
4530: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
4540: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
4550: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
4560: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
4580: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
4590: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
45a0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
45b0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
45c0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
45d0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
45e0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
45f0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4600: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4610: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
4620: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
4630: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
4640: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
4650: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
4660: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
4670: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
4680: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
4690: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
46a0: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
46b0: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
46c0: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
46d0: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
46e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
46f0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
4700: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
4710: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
4720: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
4730: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
4740: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
4750: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
4760: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4770: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
4780: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
4790: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
47a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
47b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
47c0: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
47d0: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
47e0: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
47f0: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
4800: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
4810: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
4820: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
4830: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
4840: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
4850: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
4860: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
4870: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
4880: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
4890: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
48a0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
48b0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
48c0: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
48d0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
48e0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
48f0: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
4900: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
4910: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
4920: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
4930: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
4940: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
4950: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4960: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
4970: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
4980: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4990: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
49a0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
49b0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
49c0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
49d0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
49e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
49f0: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
4a00: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4a10: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
4a20: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
4a30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
4a40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4a60: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
4a70: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
4a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
4a90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4aa0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
4ab0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
4ac0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
4ad0: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
4ae0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
4af0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
4b00: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4b10: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4b20: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4b30: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4b40: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4b50: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4b60: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4b70: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4b80: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4b90: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4ba0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4bb0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4bc0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4bd0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4be0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4c00: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
4c10: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
4c20: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
4c30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4c40: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
4c50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4c60: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
4c70: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
4c80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4c90: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4ca0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
4cb0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
4cc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4cd0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4ce0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
4cf0: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
4d00: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
4d10: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
4d20: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
4d30: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
4d40: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
4d50: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4d60: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4d70: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d80: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
4d90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
4da0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
4db0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4dc0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4dd0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
4de0: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
4df0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
4e00: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
4e10: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4e20: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4e30: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4e40: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4e50: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
4e60: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
4e70: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
4e80: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
4e90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
4ea0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
4eb0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
4ec0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
4ed0: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
4ee0: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
4ef0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
4f00: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
4f10: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
4f20: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
4f30: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
4f40: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
4f50: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
4f60: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
4f70: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
4f80: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
4f90: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
4fa0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
4fb0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
4fc0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
4fd0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
4fe0: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
5000: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
5010: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
5020: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
5030: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
5040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
5060: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
5070: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
5080: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5090: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
50a0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
50b0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
50c0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
50d0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
50e0: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
50f0: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
5100: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
5110: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
5120: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
5130: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
5140: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
5150: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
5160: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
5170: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
5180: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
5190: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
51a0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
51b0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
51c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
51d0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
51e0: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
51f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
5200: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
5210: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
5220: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
5230: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
5240: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
5250: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
5260: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
5270: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
5280: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
5290: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
52a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
52b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
52c0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
52d0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
52e0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
52f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
5300: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
5310: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
5320: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
5330: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
5340: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
5350: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
5360: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
5370: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
5380: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
5390: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
53a0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
53b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
53c0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
53f0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
5400: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
5410: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
5420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
5430: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
5440: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
5470: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
5480: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
5490: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
54a0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
54b0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
54c0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
54d0: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
54e0: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
54f0: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
5500: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
5510: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
5520: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
5530: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
5540: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
5550: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
5560: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
5570: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
5580: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
5590: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
55a0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
55b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
55c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
55d0: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
55e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
55f0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
5600: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
5610: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
5620: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
5630: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
5640: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
5650: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
5660: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
5670: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
5680: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
5690: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
56a0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
56b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
56c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
56d0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
56e0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
56f0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
5700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
5710: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
5720: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
5730: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
5740: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
5750: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5760: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
5770: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
5780: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
5790: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
57a0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
57b0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
57c0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
57d0: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
57e0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
57f0: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
5800: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
5810: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
5820: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
5830: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
5840: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
5850: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
5860: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
5870: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
5880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
5890: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
58a0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
58b0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
58c0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
58d0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
58e0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
58f0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
5900: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
5910: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
5920: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
5930: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
5940: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
5950: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
5960: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
5970: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
5980: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
5990: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
59a0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
59b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
59c0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
59d0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
59e0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
59f0: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
5a00: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
5a10: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
5a20: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
5a40: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
5a50: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
5a60: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
5a70: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
5a80: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
5a90: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5aa0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
5ab0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
5ac0: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
5ad0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
5ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
5af0: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
5b00: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
5b10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
5b20: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
5b30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5b40: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
5b50: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
5b60: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
5b70: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
5b80: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
5b90: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
5ba0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
5bb0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
5bc0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
5bd0: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
5be0: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
5bf0: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
5c00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5c10: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
5c20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5c30: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
5c40: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
5c50: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
5c60: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
5c70: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
5c80: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
5c90: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
5ca0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
5cb0: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
5cc0: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
5cd0: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
5ce0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5cf0: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
5d00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
5d10: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
5d20: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
5d30: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
5d40: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
5d50: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
5d60: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
5d70: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
5d80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5d90: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
5da0: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
5db0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
5dc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5dd0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5de0: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
5df0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
5e00: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
5e10: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
5e20: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
5e30: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
5e40: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
5e50: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
5e60: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
5e70: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
5e80: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
5e90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
5ea0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
5eb0: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
5ec0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5ed0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5ee0: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
5ef0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
5f00: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5f10: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
5f20: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
5f30: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
5f40: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
5f50: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
5f60: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
5f70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5f80: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5f90: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
5fa0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
5fb0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
5fc0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
5fd0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
5fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
5ff0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
6000: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
6010: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6020: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
6030: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6040: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
6070: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
6080: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
6090: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
60c0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
60d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
60e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
60f0: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
6100: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
6110: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6120: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
6130: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
6140: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6150: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
6160: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
6170: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
6180: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6190: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
61a0: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
61b0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
61c0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
61d0: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
61e0: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
61f0: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
6200: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
6210: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6220: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
6230: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
6240: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
6250: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
6260: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
6270: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
6280: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6290: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
62a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
62b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
62c0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
62d0: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
62e0: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
62f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
6300: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
6310: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
6320: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6330: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
6340: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
6350: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
6360: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
6370: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
6380: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
6390: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
63a0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
63b0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
63c0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
63d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
63e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
63f0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
6400: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
6410: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
6420: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
6430: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
6440: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
6450: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
6460: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
6470: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
6480: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
6490: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
64a0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
64c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
64d0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
64e0: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
64f0: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
6500: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
6510: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
6520: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6530: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
6540: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
6550: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6560: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
6570: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
6580: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
6590: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
65a0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
65b0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
65c0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
65f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6600: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
6610: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
6620: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
6630: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6650: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
6680: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
6690: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
66a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
66b0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
66c0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
66d0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
66e0: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
66f0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
6700: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
6710: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
6720: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6730: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
6740: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
6750: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
6760: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6770: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
6780: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
6790: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
67a0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
67b0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
67c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
67d0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
67e0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
67f0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
6800: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6810: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
6820: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
6830: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
6840: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
6850: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6860: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
6870: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
6880: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
6890: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
68a0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
68b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
68c0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
68d0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
68e0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
68f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
6900: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
6910: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
6920: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
6930: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
6940: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
6950: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
6960: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
6970: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
6980: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
6990: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
69a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
69b0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
69c0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
69d0: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
69e0: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
69f0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
6a00: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
6a10: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
6a20: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
6a30: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
6a40: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
6a50: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
6a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
6a70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
6a80: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
6a90: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
6aa0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
6ab0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
6ac0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
6ad0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
6ae0: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
6af0: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
6b00: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
6b10: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
6b20: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
6b30: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
6b40: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
6b50: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
6b60: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
6b70: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
6b80: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
6b90: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6ba0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
6bb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
6bc0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
6bd0: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
6be0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c10: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6c20: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
6c30: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
6c40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6c50: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
6c60: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
6c70: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6c80: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
6c90: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
6ca0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
6cb0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
6cc0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
6cd0: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
6ce0: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
6cf0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6d00: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
6d10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
6d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6d30: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
6d40: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
6d50: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
6d60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6d70: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6d80: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
6d90: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
6da0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
6db0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
6dc0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
6dd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6de0: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
6df0: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
6e00: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
6e10: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
6e20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
6e30: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
6e40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6e50: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
6e60: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
6e70: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
6e80: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
6e90: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
6ea0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
6eb0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
6ec0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
6ed0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
6ee0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
6ef0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
6f00: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
6f10: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
6f20: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
6f30: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
6f40: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
6f50: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
6f60: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
6f70: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
6f80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
6f90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
6fa0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
6fb0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
6fc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6fd0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
6fe0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
6ff0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7000: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
7010: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7020: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
7030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
7040: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
7050: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7060: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
7070: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
7080: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
7090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
70a0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
70b0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
70c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
70d0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
70e0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
70f0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
7100: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
7110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
7120: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
7130: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
7140: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
7150: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
7160: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
7170: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
7180: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
7190: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
71a0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
71b0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
71c0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
71d0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
71e0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
71f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
7200: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
7210: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
7220: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
7230: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
7240: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
7250: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
7260: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
7270: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
7280: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
7290: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
72a0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
72b0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
72c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
72d0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
72e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
72f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7300: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7310: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7320: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
7330: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
7340: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
7350: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
7360: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
7370: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7380: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
7390: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
73a0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
73b0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
73c0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
73d0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
7400: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
7410: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7440: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
7450: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7460: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
7470: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
7480: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7490: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
74a0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
74b0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
74c0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
74d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74e0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
74f0: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
7500: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
7510: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
7520: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
7530: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
7540: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
7550: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
7560: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
7570: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
7580: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
7590: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
75a0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
75b0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
75c0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
75d0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
75e0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
75f0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
7600: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
7610: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
7620: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7630: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
7640: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
7650: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
7660: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
7670: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
7680: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
7690: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
76a0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
76b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
76c0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
76d0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
76e0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
76f0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
7700: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
7710: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
7720: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
7730: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
7740: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
7750: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
7760: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
7770: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
7780: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
7790: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
77a0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
77b0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
77c0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
77d0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
77e0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
77f0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
7800: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
7810: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
7820: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
7830: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
7840: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
7850: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
7860: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
7870: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
7880: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
7890: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
78a0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
78b0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
78c0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
78d0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
78e0: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
78f0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
7900: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
7910: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
7920: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
7930: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
7940: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
7950: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
7960: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
7970: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
7980: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
7990: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
79a0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
79b0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
79c0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
79d0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
79e0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
79f0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
7a00: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
7a10: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
7a20: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
7a30: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
7a40: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
7a50: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
7a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
7a70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
7a80: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
7a90: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
7aa0: 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  c );.  if( (pPag
7ab0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
7ac0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
7ad0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
7ae0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
7af0: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
7b00: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
7b10: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
7b20: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
7b30: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
7b40: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  .    memcpy(zHea
7b50: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
7b60: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
7b70: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
7b80: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7b90: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7ba0: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
7bb0: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
7bc0: 0a 20 20 20 20 7a 48 65 61 64 65 72 5b 30 5d 20  .    zHeader[0] 
7bd0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 70 75 74 33  = '\0';.    put3
7be0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7bf0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7c00: 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a  gic)], 0);.  }..
7c10: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
7c20: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
7c30: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
7c40: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7c50: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
7c60: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
7c70: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7c80: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7c90: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7ca0: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
7cb0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7cc0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
7cd0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
7ce0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7cf0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7d00: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7d10: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
7d20: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
7d30: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7d40: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
7d50: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
7d60: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7d70: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d80: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
7d90: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
7da0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
7db0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7dc0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7dd0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7de0: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
7df0: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
7e00: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7e10: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7e20: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7e30: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7e40: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7e50: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7e60: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7e70: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7e80: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
7e90: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
7ea0: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
7eb0: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
7ec0: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
7ed0: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
7ee0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7ef0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7f00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7f10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7f20: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7f30: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7f40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7f50: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
7f60: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
7f70: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
7f80: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
7f90: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
7fa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
7fb0: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
7fc0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
7fd0: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
7fe0: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
7ff0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
8000: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
8010: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
8020: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
8030: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
8040: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
8050: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
8060: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
8070: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
8080: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
8090: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
80a0: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
80b0: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
80c0: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
80d0: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
80e0: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
80f0: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
8100: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
8110: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
8120: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
8130: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
8140: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
8150: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
8160: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
8170: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
8180: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
8190: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
81a0: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
81b0: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
81c0: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
81d0: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
81e0: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
81f0: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
8200: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
8210: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
8220: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
8230: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
8240: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
8250: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
8260: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
8270: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
8280: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
8290: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
82a0: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
82b0: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
82c0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
82d0: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
82e0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
82f0: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
8300: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
8310: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
8320: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
8330: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
8340: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
8350: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
8360: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
8370: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
8380: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
8390: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
83a0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
83b0: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
83c0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
83d0: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
83e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
83f0: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
8400: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8410: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8420: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
8430: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
8440: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
8450: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
8460: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8470: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
8480: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8490: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
84a0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
84b0: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
84c0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
84d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
84e0: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
84f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
8500: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
8510: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
8520: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
8530: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
8540: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8550: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
8560: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
8570: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
8580: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
8590: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
85a0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
85b0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
85c0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
85d0: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
85e0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
85f0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
8600: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
8610: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
8620: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
8630: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8640: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
8650: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
8660: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
8670: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
8680: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
8690: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
86a0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
86b0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
86c0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
86d0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
86e0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
86f0: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
8700: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
8710: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
8720: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
8730: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
8740: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
8750: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
8760: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8770: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8780: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
8790: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
87a0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
87b0: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
87c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
87d0: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
87e0: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
87f0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
8800: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
8810: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
8820: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8840: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
8850: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8860: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8870: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8880: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8890: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
88a0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
88b0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
88c0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
88e0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
88f0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
8900: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
8910: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
8920: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
8930: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8960: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8970: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8980: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8990: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
89a0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
89b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
89c0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
89d0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
89e0: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
89f0: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
8a00: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
8a10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
8a20: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
8a30: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
8a40: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
8a50: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8a60: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8a70: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8a80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8a90: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8aa0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8ab0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8ac0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8ad0: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8ae0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8af0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8b00: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8b10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8b20: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8b30: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8b40: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8b50: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8b60: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8b70: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8b80: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8b90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8ba0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8bb0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8bc0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8bd0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8be0: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8bf0: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8c00: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8c10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
8c20: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
8c30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
8c40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8c50: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8c60: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8c70: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8c80: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
8c90: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8ca0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8cb0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
8cc0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8cd0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8ce0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
8cf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8d00: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8d10: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8d20: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8d30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8d40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8d50: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8d60: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8d70: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8d90: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8da0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8db0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8dc0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8dd0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8de0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8df0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8e00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8e10: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8e20: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8e30: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e60: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8e70: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8e80: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8ea0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8eb0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8ec0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8ed0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8ee0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8ef0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8f00: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8f20: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8f30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8f40: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8f50: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8f60: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8f70: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8f80: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8f90: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8fa0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8fb0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8fc0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8fd0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8fe0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8ff0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
9000: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
9010: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
9020: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
9030: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9040: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9050: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
9060: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
9070: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9080: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9090: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
90a0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
90b0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
90c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
90d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
90e0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
90f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
9100: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
9110: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
9120: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
9130: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
9140: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
9150: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
9160: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
9170: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
9180: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9190: 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
91a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
91b0: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
91c0: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
91d0: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
91e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
91f0: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9210: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
9220: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
9230: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
9240: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
9250: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
9260: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
9270: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
9280: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
9290: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
92a0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
92b0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
92c0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
92d0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
92e0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
92f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
9300: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
9310: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
9320: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9330: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
9340: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
9350: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
9360: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
9370: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
9380: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
9390: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
93a0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
93b0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
93c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
93d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
93e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
93f0: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
9400: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9410: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9420: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
9430: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
9440: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
9450: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9460: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
9470: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
9480: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
9490: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
94a0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
94b0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
94c0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
94d0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
94e0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
94f0: 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b  PageSize16, -1);
9500: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
9510: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
9520: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9530: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61  SQLITE_OK || iPa
9540: 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69  geSize16==(u16)i
9550: 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  PageSize );..   
9560: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
9570: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
9580: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
9590: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
95a0: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
95b0: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
95c0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
95d0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
95e0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
95f0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
9600: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
9610: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
9620: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
9630: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
9640: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
9650: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
9660: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
9670: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
9680: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
9690: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
96a0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
96b0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
96c0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
96d0: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
96e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
96f0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
9700: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
9710: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
9720: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
9730: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
9740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
9750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9760: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
9770: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
9780: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
9790: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
97a0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
97b0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
97c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
97d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
97e0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
97f0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
9800: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
9810: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
9820: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
9830: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
9840: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
9850: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
9860: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
9870: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
9880: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
9890: 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
98a0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
98b0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
98c0: 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
98d0: 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
98e0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
98f0: 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
9900: 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
9910: 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
9920: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
9930: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
9940: 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
9950: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
9960: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
9970: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
9980: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
9990: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
99a0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
99b0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
99c0: 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
99d0: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
99e0: 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
99f0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
9a00: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
9a10: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
9a20: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
9a30: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
9a40: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
9a50: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
9a60: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
9a70: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
9a80: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
9a90: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
9aa0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
9ab0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
9ae0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
9b10: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
9b20: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
9b30: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9b40: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9b50: 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
9b60: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
9b70: 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
9ba0: 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
9bb0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
9bc0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9bd0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
9be0: 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
9bf0: 73 74 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ster */..  if( !
9c00: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
9c10: 72 2d 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20  r->setMaster.   
9c20: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
9c30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c40: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9c50: 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
9c60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c80: 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  FF .  ){.    ret
9c90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9ca0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
9cb0: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
9cc0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
9cd0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
9ce0: 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
9cf0: 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
9d00: 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
9d10: 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
9d20: 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
9d30: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9d40: 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
9d50: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
9d60: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
9d70: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
9d80: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
9d90: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9da0: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
9db0: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
9dc0: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
9dd0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
9de0: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
9df0: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
9e00: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
9e10: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
9e20: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9e30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
9e40: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
9e50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
9e60: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
9e70: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
9e80: 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
9e90: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
9ea0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
9eb0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
9ec0: 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
9ed0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
9ee0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
9ef0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
9f00: 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
9f10: 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
9f20: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
9f30: 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
9f40: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
9f50: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9f60: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
9f70: 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
9f80: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
9f90: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
9fa0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
9fb0: 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
9fc0: 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
9fd0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
9fe0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9ff0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
a000: 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
a010: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
a020: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
a030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a040: 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
a050: 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
a060: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
a070: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
a080: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
a090: 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
a0a0: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
a0b0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a0c0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
a0d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a0e0: 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
a0f0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
a100: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
a110: 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Sync;..  /* If t
a120: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
a130: 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
a140: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
a150: 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
a160: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
a170: 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
a180: 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
a190: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
a1a0: 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
a1b0: 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
a1c0: 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
a1d0: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
a1e0: 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
a1f0: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
a200: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
a210: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
a220: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
a230: 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
a240: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
a250: 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
a260: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
a270: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
a280: 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
a290: 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
a2a0: 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
a2b0: 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
a2c0: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
a2d0: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
a2e0: 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
a2f0: 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
a300: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
a320: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
a330: 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
a340: 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
a350: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a360: 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
a370: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a380: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
a390: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a3a0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
a3b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
a3c0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
a3d0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
a3e0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
a3f0: 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  r. Return.** a p
a400: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
a410: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ge or NULL if th
a420: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
a430: 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65   is not .** alre
a440: 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ady in memory..*
a450: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
a460: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
a470: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
a480: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
a490: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a4b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
a4c0: 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
a4d0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61  ossible for a ca
a4e0: 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63  ll to PcacheFetc
a4f0: 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46  h() with createF
a500: 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66  lag==0 to.  ** f
a510: 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74  ail, since no at
a520: 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
a530: 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  e dynamic memory
a540: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20   will be made.. 
a550: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
a560: 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
a570: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
a580: 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
a590: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
a5a0: 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
a5b0: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
a5c0: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 61  state, discard a
a5d0: 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
a5e0: 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61  es. If.** the pa
a5f0: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
a600: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
a610: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
a620: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68  ..**.** TODO: Wh
a630: 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73  y can we not res
a640: 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68 69  et the pager whi
a650: 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  le in error stat
a660: 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e?.*/.static voi
a670: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
a680: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a690: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70  if( SQLITE_OK==p
a6a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
a6b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  {.    sqlite3Bac
a6c0: 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
a6d0: 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  r->pBackup);.   
a6e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
a6f0: 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
a700: 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  che);.    pPager
a710: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
a720: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
a730: 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
a740: 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
a750: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
a760: 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
a770: 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
a780: 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
a790: 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
a7a0: 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
a7b0: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
a7c0: 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
a7d0: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
a7e0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
a7f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a800: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
a810: 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
a820: 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a840: 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
a850: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
a860: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
a870: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
a880: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
a890: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
a8a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
a8b0: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
a8c0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
a8d0: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
a8e0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
a8f0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
a900: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
a910: 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
a920: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a930: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
a940: 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
a950: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
a960: 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
a970: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
a980: 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
a990: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
a9a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
a9b0: 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
a9c0: 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
a9d0: 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
a9e0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
a9f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
aa00: 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
aa10: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
aa20: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
aa30: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
aa40: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
aa50: 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
aa60: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
aa70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
aa80: 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
aa90: 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
aaa0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
aab0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
aac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
aad0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
aae0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
aaf0: 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
ab00: 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
ab10: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
ab20: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ab30: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
ab40: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
ab50: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ab60: 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
ab70: 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
ab80: 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
ab90: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
aba0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
abb0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
abc0: 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
abd0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
abe0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
abf0: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
ac00: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
ac10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ac20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
ac30: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
ac40: 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63   file. This func
ac50: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
ac60: 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  if the pager.** 
ac70: 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
ac80: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mode..**.** If t
ac90: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
aca0: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
acb0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
acc0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
acd0: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
ace0: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
acf0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
ad00: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
ad10: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
ad20: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
ad30: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
ad40: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
ad50: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
ad60: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
ad70: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
ad80: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
ad90: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
ada0: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
adb0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
adc0: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
add0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
ade0: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
adf0: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
ae00: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
ae10: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ae40: 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  code */..    /* 
ae50: 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65  Always close the
ae60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
ae70: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
ae80: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
ae90: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
aea0: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
aeb0: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
aec0: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
aed0: 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  ht.    ** delete
aee0: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
aef0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
af00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
af10: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
af20: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
af30: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
af40: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
af50: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
af60: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
af70: 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76     releaseAllSav
af80: 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
af90: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
afa0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
afb0: 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20  , somebody else 
afc0: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e  might change it.
afd0: 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   The.    ** valu
afe0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  es stored in Pag
aff0: 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d  er.dbSize etc. m
b000: 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61  ight become inva
b010: 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  lid if.    ** th
b020: 69 73 20 68 61 70 70 65 6e 73 2e 20 54 4f 44 4f  is happens. TODO
b030: 3a 20 52 65 61 6c 6c 79 2c 20 74 68 69 73 20 64  : Really, this d
b040: 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62  oesn't need to b
b050: 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a  e cleared.    **
b060: 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67   until the chang
b070: 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20  e-counter check 
b080: 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68  fails in PagerSh
b090: 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20  aredLock()..    
b0a0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
b0b0: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
b0c0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f  .    rc = osUnlo
b0d0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
b0e0: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
b0f0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61   rc ){.      pPa
b100: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
b110: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  c;.    }.    IOT
b120: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
b130: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
b140: 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65     /* If Pager.e
b150: 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74  rrCode is set, t
b160: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b170: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63  he pager cache c
b180: 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20  annot be.    ** 
b190: 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
b1a0: 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  t the pager file
b1b0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68   is unlocked, th
b1c0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b1d0: 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63  e.    ** cache c
b1e0: 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20  an be discarded 
b1f0: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
b200: 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65  de safely cleare
b210: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
b220: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
b230: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  e ){.      if( r
b240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b250: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
b260: 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
b270: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
b280: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
b290: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
b2a0: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
b2b0: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
b2c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
b2d0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
b2e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
b2f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
b300: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
b310: 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52  en an IOERR, COR
b320: 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72  RUPT or FULL err
b330: 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f  or.** may have o
b340: 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69 72  ccurred. The fir
b350: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
b360: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
b370: 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74  pager .** struct
b380: 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ure, the second 
b390: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
b3a0: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
b3b0: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 0a  ned by a pager .
b3c0: 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  ** API function.
b3d0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
b3e0: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
b3f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b400: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73  ment .** to this
b410: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
b420: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
b430: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
b440: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
b450: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
b460: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
b470: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
b480: 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20  rsistent. Until 
b490: 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65 72  the persisten er
b4a0: 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a  ror is cleared,.
b4b0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50  ** subsequent AP
b4c0: 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20  I calls on this 
b4d0: 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
b4e0: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68  iately return th
b4f0: 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72  e same .** error
b500: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70   code..**.** A p
b510: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b520: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
b530: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b540: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
b550: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
b560: 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
b570: 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
b580: 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
b590: 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
b5a0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b5b0: 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
b5c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
b5d0: 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
b5e0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
b5f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
b600: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
b610: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
b620: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
b630: 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
b640: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b650: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b660: 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
b670: 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
b680: 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
b690: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
b6a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b6b0: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
b6c0: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
b6d0: 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
b6e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
b6f0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
b700: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
b710: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
b720: 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
b730: 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
b740: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
b750: 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20  R.  );.  if(.   
b760: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
b770: 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  L ||.    rc2==SQ
b780: 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
b790: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f    rc2==SQLITE_CO
b7a0: 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70  RRUPT.  ){.    p
b7b0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
b7c0: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61   rc;.    if( pPa
b7d0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
b7e0: 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26  R_UNLOCK .     &
b7f0: 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
b800: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
b810: 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
b820: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
b830: 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72  the pager is alr
b840: 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63  eady unlocked, c
b850: 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  all pager_unlock
b860: 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20  () now to.      
b870: 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  ** clear the err
b880: 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73  or state and ens
b890: 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
b8a0: 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20  er-cache is .   
b8b0: 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79     ** completely
b8c0: 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f   empty..      */
b8d0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  .      pager_unl
b8e0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
b8f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b900: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  rc;.}../*.** Exe
b910: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
b920: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
b930: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
b940: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
b950: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
b960: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
b970: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
b980: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
b990: 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
b9a0: 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
b9b0: 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
b9c0: 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
b9d0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
b9e0: 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
b9f0: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
ba00: 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
ba10: 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
ba20: 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
ba30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ba40: 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  le and clear the
ba50: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 49 66   error state. If
ba60: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
ba70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
ba80: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
ba90: 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
baa0: 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63 6f 6e  em, the next con
bab0: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62  nection.** to ob
bac0: 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
bad0: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
bae0: 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
baf0: 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20  is one) will.** 
bb00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
bb10: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
bb20: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
bb30: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
bb40: 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  or state, but an
bb50: 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
bb60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
bb70: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
bb80: 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
bb90: 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
bba0: 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
bbb0: 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
bbc0: 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
bbd0: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
bbe0: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
bbf0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
bc00: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
bc10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bc20: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
bc30: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
bc40: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
bc50: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
bc60: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
bc70: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
bc80: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
bc90: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
bca0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
bcb0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
bcc0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
bcd0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
bce0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
bcf0: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
bd00: 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
bd10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
bd20: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
bd30: 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
bd40: 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
bd50: 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
bd60: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
bd70: 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
bd80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
bd90: 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
bda0: 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
bdb0: 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
bdc0: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
bdd0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
bde0: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
bdf0: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
be00: 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
be10: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
be20: 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
be30: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
be40: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
be50: 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
be60: 53 48 41 52 45 44 20 6f 72 20 50 41 47 45 52 5f  SHARED or PAGER_
be70: 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
be80: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
be90: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
bea0: 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65 74 75  is a no-op (retu
beb0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a  rns SQLITE_OK)..
bec0: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
bed0: 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
bee0: 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
bef0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
bf00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
bf10: 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
bf20: 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
bf30: 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
bf40: 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
bf50: 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
bf60: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
bf70: 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
bf80: 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
bf90: 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
bfa0: 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
bfb0: 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
bfc0: 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
bfd0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
bfe0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bff0: 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
c000: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
c010: 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
c020: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
c030: 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
c040: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
c050: 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
c060: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
c070: 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
c080: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
c090: 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
c0a0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
c0b0: 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
c0c0: 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
c0d0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
c0e0: 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
c0f0: 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
c100: 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
c110: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c120: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
c130: 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
c140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
c150: 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
c160: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
c170: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
c180: 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
c190: 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
c1a0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
c1b0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
c1c0: 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
c1d0: 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
c1e0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
c1f0: 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
c200: 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
c210: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
c220: 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
c230: 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
c240: 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
c250: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
c260: 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
c270: 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
c280: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c290: 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
c2a0: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
c2b0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
c2c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
c2d0: 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
c2e0: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
c2f0: 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
c300: 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
c310: 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
c320: 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
c330: 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
c340: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
c350: 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
c360: 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
c370: 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
c380: 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
c390: 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
c3a0: 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
c3b0: 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
c3c0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
c3d0: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
c3e0: 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
c3f0: 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69 6e 67  ized, if running
c400: 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
c410: 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 70  e mode, the.** p
c420: 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
c430: 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
c440: 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64 65 73   (and downgrades
c450: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
c460: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
c470: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29 2e 0a  e accordingly)..
c480: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
c490: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
c4a0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
c4b0: 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45 52 5f  and is in PAGER_
c4c0: 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a 2a 2a  SYNCED state,.**
c4d0: 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50 41 47   it moves to PAG
c4e0: 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20 4e 6f  ER_EXCLUSIVE. No
c4f0: 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77 6e 67   locks are downg
c500: 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e 6e 69  raded when runni
c510: 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75 73 69  ng in.** exclusi
c520: 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  ve mode..**.** S
c530: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c540: 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
c550: 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
c560: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
c570: 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
c580: 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
c590: 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
c5a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
c5b0: 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
c5c0: 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
c5d0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
c5e0: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
c5f0: 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
c600: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
c610: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c620: 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
c630: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
c640: 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
c650: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
c660: 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
c670: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c680: 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
c690: 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
c6a0: 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
c6b0: 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
c6c0: 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
c6d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
c6e0: 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
c6f0: 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
c700: 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
c710: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
c720: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c730: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
c740: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
c750: 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29  , int hasMaster)
c760: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c770: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
c780: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c790: 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
c7a0: 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
c7b0: 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
c7c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
c7d0: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c7e0: 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
c7f0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  peration */..  i
c800: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
c810: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
c820: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c830: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
c840: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
c850: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
c860: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
c870: 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
c880: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c890: 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
c8a0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
c8b0: 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 4f 44  ) ){..    /* TOD
c8c0: 4f 3a 20 54 68 65 72 65 27 73 20 61 20 70 72 6f  O: There's a pro
c8d0: 62 6c 65 6d 20 68 65 72 65 20 69 66 20 61 20 6a  blem here if a j
c8e0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 77 61 73 20  ournal-file was 
c8f0: 6f 70 65 6e 65 64 20 69 6e 20 4d 45 4d 4f 52 59  opened in MEMORY
c900: 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 61 6e 64  .    ** mode and
c910: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
c920: 6c 2d 6d 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l-mode is change
c930: 64 20 74 6f 20 54 52 55 4e 43 41 54 45 20 6f 72  d to TRUNCATE or
c940: 20 50 45 52 53 49 53 54 0a 20 20 20 20 2a 2a 20   PERSIST.    ** 
c950: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
c960: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 63 6f 64  action. This cod
c970: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  e should be chan
c980: 67 65 64 20 74 6f 20 61 73 73 75 6d 65 0a 20 20  ged to assume.  
c990: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6a 6f    ** that the jo
c9a0: 75 72 6e 61 6c 20 6d 6f 64 65 20 68 61 73 20 6e  urnal mode has n
c9b0: 6f 74 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65  ot changed since
c9c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c9d0: 20 77 61 73 0a 20 20 20 20 2a 2a 20 73 74 61 72   was.    ** star
c9e0: 74 65 64 2e 20 41 6e 64 20 74 68 65 20 73 71 6c  ted. And the sql
c9f0: 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
ca00: 4d 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Mode() function 
ca10: 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a  should be.    **
ca20: 20 63 68 61 6e 67 65 64 20 74 6f 20 6d 61 6b 65   changed to make
ca30: 20 73 75 72 65 20 74 68 61 74 20 74 68 69 73 20   sure that this 
ca40: 69 73 20 74 68 65 20 63 61 73 65 20 74 6f 6f 2e  is the case too.
ca50: 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  .    */..    /* 
ca60: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
ca70: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
ca80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
ca90: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
caa0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
cab0: 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
cac0: 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c   isMemoryJournal
cad0: 20 3d 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a   = sqlite3IsMemJ
cae0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
caf0: 66 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fd);.      sqlit
cb00: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
cb10: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
cb20: 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e  ( !isMemoryJourn
cb30: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  al ){.        rc
cb40: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
cb50: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
cb60: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
cb70: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
cb80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
cb90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
cba0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
cbb0: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
cbc0: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
cbd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
cbe0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
cbf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
cc00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cc10: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
cc20: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
cc30: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
cc40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cc50: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
cc60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cc70: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
cc80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
cc90: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
cca0: 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  ode .     || pPa
ccb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
ccc0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ccd0: 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
cce0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
ccf0: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
cd00: 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
cd10: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
cd20: 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
cd30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cd40: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
cd50: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cd60: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
cd70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cd80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
cd90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cda0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cdb0: 44 45 4c 45 54 45 20 29 3b 0a 20 20 20 20 20 20  DELETE );.      
cdc0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cdd0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
cde0: 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
cdf0: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
ce00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ce10: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
ce20: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
ce30: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
ce40: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
ce50: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
ce60: 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65  PAGES.    sqlite
ce70: 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
ce80: 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
ce90: 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
cea0: 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66  agehash);.#endif
ceb0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ..    sqlite3Pca
cec0: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
ced0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
cee0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
cef0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
cf00: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
cf10: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
cf20: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  al = 0;.    pPag
cf30: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
cf40: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
cf50: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
cf60: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
cf70: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
cf80: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
cf90: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
cfa0: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
cfb0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
cfc0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
cfd0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
cfe0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
cff0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
d000: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
d010: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
d020: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
d030: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
d040: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
d050: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
d060: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
d070: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  ;..  /* TODO: Is
d080: 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57   this optimal? W
d090: 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a  hy is the db siz
d0a0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65  e invalidated he
d0b0: 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  re .  ** when th
d0c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d0d0: 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f  is not unlocked?
d0e0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
d0f0: 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20  OrigSize = 0;.  
d100: 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
d110: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
d120: 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
d130: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d  bSize);.  if( !M
d140: 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
d150: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
d160: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
d170: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
d180: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
d190: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
d1a0: 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
d1b0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
d1c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
d1d0: 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
d1e0: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
d1f0: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
d200: 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
d210: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
d220: 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
d230: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
d240: 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
d250: 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
d260: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
d270: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
d280: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
d290: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
d2a0: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
d2b0: 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
d2c0: 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
d2d0: 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
d2e0: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
d2f0: 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
d300: 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
d310: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d320: 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
d330: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
d340: 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
d350: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
d360: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
d370: 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
d380: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
d390: 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
d3a0: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
d3b0: 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
d3c0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
d3d0: 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
d3e0: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
d3f0: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
d400: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
d410: 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
d420: 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
d430: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
d440: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
d450: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
d460: 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
d470: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
d480: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
d490: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
d4a0: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
d4b0: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
d4c0: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
d4d0: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
d4e0: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
d4f0: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
d500: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
d510: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
d520: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
d530: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
d540: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
d550: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
d560: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
d570: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
d580: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
d590: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
d5a0: 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
d5b0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
d5c0: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
d5d0: 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
d5e0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d5f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
d600: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
d610: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
d620: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
d630: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
d640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
d650: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
d660: 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
d670: 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
d680: 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
d690: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
d6a0: 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
d6b0: 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
d6c0: 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
d6d0: 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
d6e0: 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
d6f0: 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
d700: 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
d710: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
d720: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
d730: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d740: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
d750: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
d760: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
d770: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
d780: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
d790: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
d7a0: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
d7b0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
d7c0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
d7d0: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
d7e0: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
d7f0: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
d800: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
d810: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
d820: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
d830: 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
d840: 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
d850: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
d860: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
d870: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
d880: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
d890: 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
d8a0: 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
d8b0: 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
d8c0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d8d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
d8e0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
d8f0: 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
d900: 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
d910: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
d920: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
d930: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
d940: 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
d950: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
d960: 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
d970: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
d980: 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
d990: 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
d9a0: 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
d9b0: 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
d9c0: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
d9d0: 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
d9e0: 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
d9f0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
da00: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
da10: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
da20: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
da30: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
da40: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
da50: 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
da60: 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
da70: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
da80: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
da90: 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
daa0: 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
dab0: 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
dac0: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
dad0: 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
dae0: 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
daf0: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
db00: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
db10: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
db20: 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
db30: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
db40: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
db50: 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
db60: 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
db70: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
db80: 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
db90: 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
dba0: 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
dbb0: 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
dbc0: 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
dbd0: 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
dbe0: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
dbf0: 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
dc00: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
dc10: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
dc20: 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
dc30: 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
dc40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
dc50: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
dc60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
dc70: 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
dc80: 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
dc90: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
dca0: 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
dcb0: 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
dcc0: 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
dcd0: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
dce0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
dcf0: 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
dd00: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
dd10: 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
dd20: 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
dd30: 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
dd40: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
dd50: 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
dd60: 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
dd70: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
dd80: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
dd90: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
dda0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ddb0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
ddc0: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
ddd0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
dde0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
ddf0: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
de00: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
de10: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
de20: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
de30: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
de40: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
de50: 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c  .  int isUnsync,
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
de80: 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65  ing from unsynce
de90: 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  d main journal *
dea0: 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
deb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dec0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
ded0: 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
dee0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  k */.  int isSav
def0: 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  epnt,           
df00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
df10: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
df20: 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  lback */.  Bitve
df30: 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20  c *pDone        
df40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
df50: 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
df60: 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
df70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
df80: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
dfb0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
dfc0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
dff0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
e000: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
e010: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e030: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
e040: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
e050: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
e060: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
e070: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
e080: 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
e090: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
e0a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e0c0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e0d0: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
e0e0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  al file */..  as
e0f0: 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
e100: 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
e110: 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
e120: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
e130: 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
e140: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
e150: 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
e160: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
e170: 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
e180: 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
e190: 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
e1a0: 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
e1b0: 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
e1c0: 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
e1d0: 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
e1e0: 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
e1f0: 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
e200: 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
e210: 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  (u8*)pPager->pTm
e220: 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
e230: 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
e240: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
e250: 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
e260: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
e270: 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  ted */..  /* Rea
e280: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
e290: 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
e2a0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e2b0: 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
e2c0: 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
e2d0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
e2e0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
e2f0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
e300: 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
e310: 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
e320: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
e330: 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
e340: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
e350: 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
e360: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
e370: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
e380: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
e390: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
e3a0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
e3b0: 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
e3c0: 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
e3d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e3e0: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
e3f0: 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
e400: 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
e410: 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
e420: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
e430: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
e440: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
e450: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
e460: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
e470: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
e480: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
e490: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
e4a0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
e4b0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
e4c0: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
e4d0: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
e4e0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e4f0: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
e500: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
e510: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
e520: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
e530: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
e540: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
e550: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
e560: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
e570: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e580: 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
e590: 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
e5a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
e5b0: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
e5c0: 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
e5d0: 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
e5e0: 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
e5f0: 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
e600: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e610: 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
e620: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
e630: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
e640: 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
e650: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
e660: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
e670: 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
e680: 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
e690: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
e6a0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
e6b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
e6c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
e6d0: 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
e6e0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
e6f0: 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
e700: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e710: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e720: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
e730: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e740: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
e750: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e760: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
e770: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
e780: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
e790: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
e7a0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
e7b0: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
e7c0: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
e7d0: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
e7e0: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
e7f0: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
e800: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
e810: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
e820: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
e830: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
e840: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
e850: 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
e860: 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
e870: 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
e880: 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
e890: 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
e8a0: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
e8b0: 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
e8c0: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
e8d0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
e8e0: 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
e8f0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
e900: 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
e910: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
e920: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
e930: 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
e940: 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
e950: 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
e960: 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
e970: 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
e980: 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
e990: 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
e9a0: 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
e9b0: 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
e9c0: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
e9d0: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
e9e0: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
e9f0: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
ea00: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
ea10: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
ea20: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
ea30: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
ea40: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
ea50: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
ea60: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
ea70: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
ea80: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
ea90: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
eaa0: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
eab0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
eac0: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
ead0: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
eae0: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
eaf0: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
eb00: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
eb10: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
eb20: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
eb30: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
eb40: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
eb50: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
eb60: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
eb70: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
eb80: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
eb90: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
eba0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
ebb0: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
ebc0: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
ebd0: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
ebe0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
ebf0: 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
ec00: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
ec10: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
ec20: 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
ec30: 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
ec40: 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
ec50: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
ec60: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
ec70: 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
ec80: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
ec90: 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
eca0: 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
ecb0: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
ecc0: 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
ecd0: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
ece0: 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
ecf0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
ed00: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ed10: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
ed20: 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
ed30: 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
ed40: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
ed50: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
ed60: 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
ed70: 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
ed80: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
ed90: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
eda0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
edb0: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
edc0: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
edd0: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
ede0: 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
edf0: 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
ee00: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
ee10: 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
ee20: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
ee30: 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
ee40: 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
ee50: 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
ee60: 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
ee70: 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
ee80: 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
ee90: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
eea0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
eeb0: 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
eec0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ned..  */.  pPg 
eed0: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
eee0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
eef0: 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
ef00: 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52  MEMDB );.  PAGER
ef10: 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
ef20: 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
ef30: 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
ef50: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
ef60: 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
ef70: 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
ef80: 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20  ize, aData),.   
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d              (isM
efa0: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
efb0: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
efc0: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
efd0: 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
efe0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
eff0: 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30  E).   && (pPg==0
f000: 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
f010: 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
f020: 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65  NC)).   && isOpe
f030: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
f040: 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20   && !isUnsync.  
f050: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
f060: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
f070: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f080: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
f090: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
f0a0: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
f0b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
f0c0: 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
f0d0: 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
f0e0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
f0f0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
f100: 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
f110: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
f120: 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
f130: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
f140: 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
f150: 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
f160: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
f170: 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
f180: 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
f190: 6f 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20  o, aData);.     
f1a0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
f1b0: 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 30 2c 20  aData, pgno, 0, 
f1c0: 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
f1d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
f1e0: 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
f1f0: 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
f200: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
f210: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
f220: 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
f230: 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
f240: 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
f250: 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
f260: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
f270: 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
f280: 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
f290: 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
f2a0: 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
f2b0: 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
f2c0: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
f2d0: 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
f2e0: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
f2f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
f300: 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
f310: 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
f320: 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
f330: 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
f340: 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
f350: 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
f360: 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
f370: 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
f380: 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
f390: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
f3a0: 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
f3b0: 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
f3c0: 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
f3d0: 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
f3e0: 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
f3f0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
f400: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
f410: 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
f420: 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
f430: 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
f440: 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
f450: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
f460: 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
f470: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
f480: 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
f490: 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
f4a0: 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
f4b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
f4c0: 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
f4d0: 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
f4e0: 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
f4f0: 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
f500: 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
f510: 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
f520: 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
f530: 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
f540: 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
f550: 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
f560: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
f570: 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
f580: 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73  .    if( (rc = s
f590: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
f5a0: 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
f5b0: 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49   &pPg, 1))!=SQLI
f5c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
f5d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f5e0: 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26      pPg->flags &
f5f0: 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45  = ~PGHDR_NEED_RE
f600: 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  AD;.    sqlite3P
f610: 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
f620: 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Pg);.  }.  if( p
f630: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
f640: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
f650: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
f660: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
f670: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
f680: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
f690: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
f6a0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
f6b0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
f6c0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
f6d0: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
f6e0: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
f6f0: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
f700: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
f710: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
f720: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
f730: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
f740: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
f750: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
f760: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
f770: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
f780: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
f790: 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
f7a0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
f7b0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
f7c0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
f7d0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f7e0: 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
f7f0: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
f800: 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
f810: 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
f820: 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
f830: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f840: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
f850: 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
f860: 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
f870: 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
f880: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
f890: 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
f8a0: 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
f8b0: 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
f8c0: 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
f8d0: 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
f8e0: 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
f8f0: 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
f900: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
f910: 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
f920: 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
f930: 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
f940: 69 74 20 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20  it out to the.. 
f950: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
f960: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
f970: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
f980: 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
f990: 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
f9a0: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
f9b0: 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
f9c0: 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
f9d0: 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
f9e0: 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
f9f0: 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
fa00: 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
fa10: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
fa20: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
fa30: 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
fa40: 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
fa50: 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
fa60: 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
fa70: 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
fa80: 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
fa90: 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
faa0: 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
fab0: 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
fac0: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
fad0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
fae0: 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
faf0: 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
fb00: 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
fb10: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
fb20: 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
fb30: 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
fb40: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
fb50: 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
fb60: 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
fb70: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
fb80: 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
fb90: 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
fba0: 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
fbb0: 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
fbc0: 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
fbd0: 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
fbe0: 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
fbf0: 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
fc00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
fc10: 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
fc20: 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
fc30: 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
fc40: 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
fc50: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
fc60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
fc70: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
fc80: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
fc90: 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
fca0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  /.      sqlite3P
fcb0: 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
fcc0: 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Pg);.    }.#ifde
fcd0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
fce0: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
fcf0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
fd00: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
fd10: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
fd20: 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
fd30: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
fd40: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
fd50: 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
fd60: 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
fd70: 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
fd80: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
fd90: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
fda0: 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
fdb0: 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
fdc0: 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
fdd0: 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
fde0: 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
fdf0: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
fe00: 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
fe10: 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
fe20: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
fe30: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
fe40: 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
fe50: 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
fe60: 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
fe70: 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
fe80: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
fe90: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
fea0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
feb0: 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f  COVERAGE_TEST)./
fec0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fed0: 65 20 6c 6f 6f 6b 73 20 61 68 65 61 64 20 69 6e  e looks ahead in
fee0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  to the main jour
fef0: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 64 65 74  nal file and det
ff00: 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 65 74 68  ermines.** wheth
ff10: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6e 65  er or not the ne
ff20: 78 74 20 72 65 63 6f 72 64 20 28 74 68 65 20 72  xt record (the r
ff30: 65 63 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e  ecord that begin
ff40: 73 20 61 74 20 66 69 6c 65 0a 2a 2a 20 6f 66 66  s at file.** off
ff50: 73 65 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  set pPager->jour
ff60: 6e 61 6c 4f 66 66 29 20 69 73 20 61 20 77 65 6c  nalOff) is a wel
ff70: 6c 2d 66 6f 72 6d 65 64 20 70 61 67 65 20 72 65  l-formed page re
ff80: 63 6f 72 64 20 63 6f 6e 73 69 73 74 69 6e 67 0a  cord consisting.
ff90: 2a 2a 20 6f 66 20 61 20 76 61 6c 69 64 20 70 61  ** of a valid pa
ffa0: 67 65 20 6e 75 6d 62 65 72 2c 20 70 50 61 67 65  ge number, pPage
ffb0: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
ffc0: 20 6f 66 20 63 6f 6e 74 65 6e 74 2c 20 66 6f 6c   of content, fol
ffd0: 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 61 20 76 61  lowed.** by a va
ffe0: 6c 69 64 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  lid checksum..**
fff0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6e 65  .** The pager ne
10000 76 65 72 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f  ver needs to kno
10010 77 20 74 68 69 73 20 69 6e 20 6f 72 64 65 72 20  w this in order 
10020 74 6f 20 64 6f 20 69 74 73 20 6a 6f 62 2e 20 20  to do its job.  
10030 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
10040 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 72   is only used fr
10050 6f 6d 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  om within assert
10060 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
10070 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 73 74 61  ) macros..*/.sta
10080 74 69 63 20 69 6e 74 20 70 61 67 65 72 4e 65 78  tic int pagerNex
10090 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61  tJournalPageIsVa
100a0 6c 69 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  lid(Pager *pPage
100b0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
100c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
100d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
100e0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
100f0 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
10100 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
10110 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
10120 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10130 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
10140 65 20 66 72 6f 6d 20 72 65 61 64 20 6f 70 65 72  e from read oper
10150 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  ations */.  sqli
10160 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
10170 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
10180 63 72 69 70 74 6f 72 20 66 72 6f 6d 20 77 68 69  criptor from whi
10190 63 68 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ch we are readin
101a0 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
101b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
101c0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
101d0 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ge */..  /* Read
101e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
101f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 66 64 20   header */.  fd 
10200 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b 0a 20  = pPager->jfd;. 
10210 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
10220 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  (fd, pPager->jou
10230 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e 6f 29 3b  rnalOff, &pgno);
10240 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10250 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30  E_OK ){ return 0
10260 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
10290 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
102a0 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
102b0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
102c0 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
102d0 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
102e0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
102f0 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
10300 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10320 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
10330 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
10340 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63  checksum */.  rc
10350 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 64   = read32bits(fd
10360 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
10370 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  lOff+pPager->pag
10380 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29  eSize+4, &cksum)
10390 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
103a0 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20  TE_OK ){ return 
103b0 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
103e0 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
103f0 20 64 61 74 61 20 61 6e 64 20 76 65 72 69 66 79   data and verify
10400 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f   the checksum */
10410 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38 2a 29  .  aData = (u8*)
10420 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
10430 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
10440 33 4f 73 52 65 61 64 28 66 64 2c 20 61 44 61 74  3OsRead(fd, aDat
10450 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
10460 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ize, pPager->jou
10470 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20 20 69 66  rnalOff+4);.  if
10480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10490 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66  /*NO_TEST*/.  if
104d0 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
104e0 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
104f0 73 75 6d 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  sum ){ return 0;
10500 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
10510 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
10520 2a 20 52 65 61 63 68 20 74 68 69 73 20 70 6f 69  * Reach this poi
10530 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 70  nt only if the p
10540 61 67 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  age is valid */.
10550 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
10560 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
10570 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
10580 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
10590 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 2f 2a  AGE_TEST) */../*
105a0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
105b0 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
105c0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
105d0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
105e0 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
105f0 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
10600 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
10610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
10620 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
10630 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
10640 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
10650 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
10660 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
10670 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10680 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
10690 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
106a0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
106b0 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
106c0 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
106d0 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
106e0 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
106f0 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
10700 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
10710 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ion..**.** When 
10720 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10730 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
10740 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65  , it is populate
10750 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  d with the names
10760 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69   .** of all of i
10770 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ts child journal
10780 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f  s, one after ano
10790 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20  ther, formatted 
107a0 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63  as utf-8 .** enc
107b0 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65  oded text. The e
107c0 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64  nd of each child
107d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
107e0 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a   marked with a .
107f0 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
10800 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69  r byte (0x00). i
10810 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63  .e. the entire c
10820 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73  ontents of a mas
10830 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  ter journal.** f
10840 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61  ile for a transa
10850 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20  ction involving 
10860 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69  two databases mi
10870 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ght be:.**.**   
10880 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62  "/home/bill/a.db
10890 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d  -journal\x00/hom
108a0 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72  e/bill/b.db-jour
108b0 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41  nal\x00".**.** A
108c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
108d0 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65  file may only be
108e0 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c   deleted once al
108f0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a  l of its child .
10900 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65  ** journals have
10910 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
10920 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
10930 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65  nction reads the
10940 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
10950 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10960 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65  file into .** me
10970 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74  mory and loops t
10980 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74  hrough each of t
10990 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
109a0 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65   names. For.** e
109b0 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
109c0 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a  l, it checks if:
109d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68  .**.**   * if th
109e0 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
109f0 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73  exists, and if s
10a00 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  o.**   * if the 
10a10 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f  child journal co
10a20 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e  ntains a referen
10a30 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ce to master jou
10a40 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c  rnal .**     fil
10a50 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  e zMaster.**.** 
10a60 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e  If a child journ
10a70 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  al can be found 
10a80 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74  that matches bot
10a90 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69  h of the criteri
10aa0 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73  a.** above, this
10ab0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
10ac0 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  s without doing 
10ad0 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77  anything. Otherw
10ae0 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  ise, if.** no su
10af0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
10b00 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66   can be found, f
10b10 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64  ile zMaster is d
10b20 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74  eleted from.** t
10b30 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75  he file-system u
10b40 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
10b50 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  lete()..**.** If
10b60 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74   an IO error wit
10b70 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
10b80 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  n, an error code
10b90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
10ba0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
10bb0 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20  llocates memory 
10bc0 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
10bd0 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61  e3Malloc(). If a
10be0 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  n allocation.** 
10bf0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
10c00 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
10c10 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
10c20 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65  o IO or malloc e
10c30 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c  rrors .** occur,
10c40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
10c50 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  turned..**.** TO
10c60 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  DO: This functio
10c70 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69  n allocates a si
10c80 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65  ngle block of me
10c90 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  mory to load.** 
10ca0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
10cb0 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
10cc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10cd0 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  This could be.**
10ce0 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c   a couple of kil
10cf0 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70  obytes or so - p
10d00 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65  otentially large
10d10 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
10d20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  .** size..*/.sta
10d30 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
10d40 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
10d50 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
10d60 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
10d70 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
10d80 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
10d90 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10db0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10dc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
10dd0 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61  Master;    /* Ma
10de0 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f  lloc'd master-jo
10df0 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
10e00 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  iptor */.  sqlit
10e10 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
10e20 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  l;   /* Malloc'd
10e30 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66   child-journal f
10e40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
10e50 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
10e60 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
10e70 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
10e80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10e90 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
10ea0 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
10eb0 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
10ec0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
10ed0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
10ee0 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
10ef0 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
10f00 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
10f10 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
10f20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
10f30 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
10f40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
10f50 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
10f60 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
10f70 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
10f80 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
10f90 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
10fa0 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
10fb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
10fc0 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
10fd0 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
10fe0 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
10ff0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11000 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
11010 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  se{.    const in
11020 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
11030 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
11040 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
11050 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
11060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
11070 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
11080 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
11090 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
110a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
110b0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
110c0 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  out;..  rc = sql
110d0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
110e0 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
110f0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
11100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11110 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
11120 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
11130 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
11140 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
11150 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
11160 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
11170 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
11180 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
11190 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
111a0 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
111b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
111c0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
111d0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
111e0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
111f0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
11200 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
11210 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
11220 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
11230 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
11240 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61  3Malloc((int)nMa
11250 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
11260 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69  asterPtr);.    i
11270 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
11280 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
11290 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
112a0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
112b0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
112c0 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
112d0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
112e0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b  nMasterJournal];
112f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11300 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
11310 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
11320 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
11330 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  rnal, 0);.    if
11340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11350 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
11360 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
11370 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
11380 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
11390 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
113a0 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
113b0 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
113c0 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
113d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
113e0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
113f0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
11400 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
11410 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  &exists);.      
11420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
11440 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11460 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
11470 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
11480 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
11490 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
114a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
114b0 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
114c0 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
114d0 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
114e0 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
114f0 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
11500 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
11510 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
11520 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11530 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
11540 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
11550 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  c;.        int f
11560 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
11570 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
11580 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
11590 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
115a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
115b0 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
115c0 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
115d0 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  gs, 0);.        
115e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
115f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
11600 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11610 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
11620 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
11630 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
11640 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
11650 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
11660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11670 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
11680 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
116a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
116b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
116c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
116d0 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
116e0 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
116f0 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
11700 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
11710 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
11720 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
11730 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
11740 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
11750 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
11760 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11770 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
11780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11790 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
117a0 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
117b0 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
117c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
117d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
117e0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
117f0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
11800 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
11810 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
11820 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
11830 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
11840 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 70  );.  }  .  if( p
11850 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
11860 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
11870 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
11880 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
11890 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71  nal) );.  }.  sq
118a0 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
118b0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
118c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
118d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
118e0 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
118f0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
11900 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
11910 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
11920 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
11930 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
11940 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
11950 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
11960 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
11970 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
11980 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
11990 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
119a0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
119b0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
119c0 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
119d0 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
119e0 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68  lock is not.** h
119f0 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
11a00 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
11a10 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69  therwise, the si
11a20 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
11a30 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20  s.** changed to 
11a40 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
11a50 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
11a60 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20 74  ize bytes). If t
11a70 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69  he file.** on di
11a80 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  sk is currently 
11a90 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67  larger than nPag
11aa0 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73  e pages, then us
11ab0 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72  e the VFS.** xTr
11ac0 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20  uncate() method 
11ad0 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a  to truncate it..
11ae0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67  **.** Or, it mig
11af0 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  ht might be the 
11b00 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
11b10 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
11b20 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
11b30 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
11b40 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
11b50 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
11b60 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
11b70 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
11b80 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
11b90 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
11ba0 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
11bb0 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
11bc0 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
11bd0 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
11be0 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
11bf0 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
11c00 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
11c10 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
11c20 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
11c30 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
11c40 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
11c50 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
11c60 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
11c70 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
11c80 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
11c90 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
11ca0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
11cb0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
11cc0 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
11cd0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
11ce0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
11cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
11d00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11d10 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
11d20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
11d30 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36 34  ->fd) ){.    i64
11d40 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
11d50 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f  wSize;.    /* TO
11d60 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
11d70 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
11d80 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
11d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11da0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
11db0 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
11dc0 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
11dd0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
11de0 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Size*(i64)nPage;
11df0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11e00 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
11e10 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
11e20 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
11e30 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
11e40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11e50 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
11e60 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
11e70 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
11e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
11e90 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
11ea0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c  (pPager->fd, "",
11eb0 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a   1, newSize-1);.
11ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11ed0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11ee0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
11ef0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
11f00 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
11f10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11f20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
11f30 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
11f40 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
11f50 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
11f60 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
11f70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
11f80 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
11f90 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
11fa0 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
11fb0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
11fc0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
11fd0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
11fe0 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74   used used .** t
11ff0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
12000 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
12010 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
12020 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
12030 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
12040 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
12050 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
12060 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
12070 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
12080 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
12090 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
120a0 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
120b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
120c0 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
120d0 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
120e0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
120f0 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
12100 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
12110 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
12120 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
12130 74 6f 20 35 31 32 20 69 66 0a 2a 2a 20 69 74 20  to 512 if.** it 
12140 69 73 20 6c 65 73 73 20 74 68 61 6e 20 35 31 32  is less than 512
12150 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
12160 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
12170 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
12180 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
12190 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
121a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
121b0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
121c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
121d0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
121e0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
121f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
12200 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12210 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
12220 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
12230 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
12240 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
12250 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
12260 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
12270 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
12280 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
12290 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
122a0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
122b0 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
122c0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
122d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
122e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
122f0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
12300 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
12310 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12320 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61 67  <512 ){.    pPag
12330 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
12340 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   512;.  }.  if( 
12350 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12360 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
12370 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
12380 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
12390 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50  E>=512 );.    pP
123a0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
123b0 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
123c0 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ZE;.  }.}../*.**
123d0 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
123e0 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
123f0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
12400 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
12410 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
12420 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
12430 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
12440 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
12450 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
12460 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
12470 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
12480 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
12490 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
124a0 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
124b0 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
124c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
124d0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
124e0 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
124f0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
12500 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
12510 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
12520 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
12530 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
12540 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
12550 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
12560 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
12570 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
12580 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
12590 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
125a0 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
125b0 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
125c0 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
125d0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
125e0 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
125f0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
12600 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
12610 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
12620 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
12630 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
12640 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
12650 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
12660 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12670 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
12680 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
12690 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
126a0 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
126b0 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
126c0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
126d0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
126e0 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a  the page case..*
126f0 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20 69  *  (7)  4 byte i
12700 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
12710 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
12720 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
12730 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
12740 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
12750 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
12760 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
12770 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
12780 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
12790 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20  al.).**  (8)  N 
127a0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
127b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
127c0 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
127d0 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
127e0 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
127f0 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
12800 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
12810 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
12820 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
12830 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
12840 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
12850 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
12860 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
12870 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
12880 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
12890 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
128a0 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a  TF-8..**  (9)  Z
128b0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
128c0 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
128d0 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
128e0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
128f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
12900 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
12910 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
12920 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
12930 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
12940 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
12950 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
12960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
12970 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
12980 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61 62  first 8 items ab
12990 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
129a0 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
129b0 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
129c0 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65 6d   of the 9th item
129d0 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
129e0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
129f0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
12a00 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
12a10 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
12a20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
12a30 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
12a40 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
12a50 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
12a60 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
12a70 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
12a80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
12a90 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
12aa0 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
12ab0 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
12ac0 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
12ad0 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
12ae0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
12af0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
12b00 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12b10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
12b20 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
12b30 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
12b40 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
12b50 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
12b60 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
12b70 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
12b80 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
12b90 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
12ba0 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
12bb0 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
12bc0 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
12bd0 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
12be0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
12bf0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
12c00 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
12c10 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
12c20 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
12c30 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
12c40 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
12c50 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
12c60 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
12c70 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
12c80 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
12c90 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
12ca0 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
12cb0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
12cc0 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
12cd0 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
12ce0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
12cf0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
12d00 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
12d10 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12d20 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
12d30 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
12d40 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
12d50 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
12d60 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
12d70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
12d80 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
12d90 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
12da0 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
12db0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
12dc0 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
12dd0 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
12de0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
12df0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
12e00 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
12e10 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
12e20 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
12e30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
12e40 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
12e50 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
12e60 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
12e70 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
12e80 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
12e90 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
12ea0 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
12eb0 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
12ec0 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
12ed0 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
12ee0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
12ef0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
12f00 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
12f10 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
12f20 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
12f30 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
12f40 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
12f50 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
12f60 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
12f70 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
12f80 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
12f90 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
12fa0 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
12fb0 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
12fc0 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
12fd0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
12fe0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12ff0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
13000 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
13010 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
13020 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
13030 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
13040 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
13050 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
13060 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
13070 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
13080 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
13090 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
130a0 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
130b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
130c0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
130d0 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130f0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
13100 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
13110 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
13140 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
13150 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
13180 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
13190 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
131a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
131b0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
131c0 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
131d0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131f0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
13200 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
13210 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
13220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
13230 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
13240 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
13250 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
13260 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
13270 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
13280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
13290 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
132a0 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
132b0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
132c0 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
132d0 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
132e0 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46  lback */..  /* F
132f0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
13300 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
13310 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
13320 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
13330 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
13340 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
13350 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
13360 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
13370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13380 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
13390 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
133a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
133b0 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
133c0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
133d0 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
133e0 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
133f0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
13400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
13410 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
13420 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
13430 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
13440 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
13450 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
13460 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
13470 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
13480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
13490 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
134a0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
134b0 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
134c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
134d0 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
134e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
134f0 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
13500 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
13510 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
13520 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
13530 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
13540 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
13550 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
13560 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
13570 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
13580 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
13590 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
135a0 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
135b0 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
135c0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
135d0 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
135e0 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
135f0 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
13600 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
13610 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
13620 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
13630 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
13640 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
13650 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
13660 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
13670 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13680 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
13690 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
136a0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
136b0 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
136c0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
136d0 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
136e0 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
136f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
13700 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
13710 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
13720 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
13730 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13740 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
13750 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
13760 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
13770 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
13780 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
13790 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
137a0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
137b0 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
137c0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
137d0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
137e0 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
137f0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
13800 20 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 20     int isUnsync 
13810 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  = 0;..    /* Rea
13820 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
13830 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
13840 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13850 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
13860 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
13870 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
13880 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13890 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
138a0 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
138b0 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
138c0 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
138d0 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
138e0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
138f0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
13900 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
13910 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
13920 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
13930 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
13940 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
13950 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
13960 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
13970 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13980 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
13990 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
139a0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
139b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
139c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
139d0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
139e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
139f0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
13a00 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
13a10 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
13a20 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
13a30 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
13a40 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
13a50 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13a60 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
13a70 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
13a80 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
13a90 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
13aa0 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
13ab0 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
13ac0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
13ad0 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
13ae0 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
13af0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
13b00 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
13b10 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
13b20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13b30 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
13b40 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13b50 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
13b60 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
13b70 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13b80 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
13b90 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13ba0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
13bb0 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
13bc0 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
13bd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
13be0 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
13bf0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
13c00 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
13c10 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
13c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
13c30 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
13c40 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
13c50 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13c60 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
13c70 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
13c80 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
13c90 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
13ca0 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
13cb0 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
13cc0 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
13cd0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
13ce0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
13cf0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
13d00 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
13d10 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
13d20 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
13d30 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
13d40 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
13d50 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
13d60 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
13d70 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
13d80 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
13d90 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
13da0 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
13db0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13dc0 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
13dd0 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
13de0 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
13df0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
13e00 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
13e10 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
13e20 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
13e30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13e40 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
13e50 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
13e60 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
13e70 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
13e80 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
13e90 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
13ea0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
13eb0 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
13ec0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13ed0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
13ee0 20 74 65 73 74 63 61 73 65 28 20 6e 52 65 63 3d   testcase( nRec=
13ef0 3d 30 20 26 26 20 21 69 73 48 6f 74 0a 20 20 20  =0 && !isHot.   
13f00 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
13f10 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
13f20 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
13f30 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)!=pPager->jour
13f40 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20  nalOff.         
13f50 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  && ((szJ - pPage
13f60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
13f70 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
13f80 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20  Pager))>0.      
13f90 20 20 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a     && pagerNextJ
13fa0 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69  ournalPageIsVali
13fb0 64 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  d(pPager).    );
13fc0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
13fd0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
13fe0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13ff0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
14000 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
14010 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
14020 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
14030 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14040 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14050 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
14060 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
14070 20 20 20 20 20 69 73 55 6e 73 79 6e 63 20 3d 20       isUnsync = 
14080 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
14090 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
140a0 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
140b0 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
140c0 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
140d0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
140e0 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
140f0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
14100 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14110 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14120 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
14130 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
14140 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
14150 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
14160 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
14170 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14180 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
14190 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
141a0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
141b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
141c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
141d0 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
141e0 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
141f0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
14200 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
14210 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
14220 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65  nd/or page cache
14230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
14240 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
14250 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  +){.      if( ne
14260 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a  edPagerReset ){.
14270 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
14280 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
14290 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65       needPagerRe
142a0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  set = 0;.      }
142b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
142c0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
142d0 61 67 65 28 70 50 61 67 65 72 2c 31 2c 69 73 55  age(pPager,1,isU
142e0 6e 73 79 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a  nsync,&pPager->j
142f0 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a  ournalOff,0,0);.
14300 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14320 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14330 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14340 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14350 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
14360 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14370 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
14380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
143a0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
143b0 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
143c0 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
143d0 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
143e0 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
143f0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
14400 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
14410 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
14420 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
14430 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
14440 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
14450 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
14460 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
14470 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
14480 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
14490 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
144a0 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
144b0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
144c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
144d0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
144e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
144f0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
14500 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
14510 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
14520 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
14530 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
14540 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
14550 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
14560 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
14570 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
14580 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
14590 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
145a0 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
145b0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
145c0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
145d0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
145e0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
145f0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
14600 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
14610 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
14620 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
14630 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20    */.  assert(. 
14640 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70     pPager->fd->p
14650 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20  Methods==0 ||.  
14660 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
14670 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
14680 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
14690 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d  B_UNCHANGED,0)>=
146a0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a  SQLITE_OK.  );..
146b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
146c0 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
146d0 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
146e0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
146f0 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
14700 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
14710 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
14720 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
14730 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
14740 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
14750 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14760 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
14770 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
14780 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
14790 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
147a0 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
147b0 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
147c0 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
147d0 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
147e0 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
147f0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
14800 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
14810 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
14820 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
14830 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
14840 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
14850 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
14860 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
14870 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
14880 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
14890 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
148a0 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
148b0 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
148c0 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
148d0 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
148e0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
148f0 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
14900 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
14910 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
14920 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
14930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14940 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
14950 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
14960 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
14970 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
14980 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
14990 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
149a0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
149b0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
149c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
149d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
149e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
149f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
14a00 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
14a10 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
14a20 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74  ='\0');.    test
14a30 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14a40 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
14a50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14a60 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
14a70 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
14a80 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
14a90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
14aa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
14ab0 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
14ac0 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
14ad0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
14ae0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
14af0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
14b00 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
14b10 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
14b20 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
14b30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14b50 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
14b60 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
14b70 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
14b80 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
14b90 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
14ba0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
14bb0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
14bc0 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
14bd0 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
14be0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
14bf0 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
14c00 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
14c10 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
14c20 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
14c30 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
14c40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14c50 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
14c60 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
14c70 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
14c80 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
14c90 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
14ca0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
14cb0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
14cc0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
14cd0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
14ce0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
14cf0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
14d00 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
14d10 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
14d20 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
14d30 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
14d40 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
14d50 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
14d60 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
14d70 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
14d80 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
14d90 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
14da0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
14db0 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
14dc0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
14dd0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
14de0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
14df0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
14e00 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
14e10 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
14e20 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
14e30 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
14e40 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
14e50 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
14e60 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
14e70 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
14e80 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14e90 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
14ea0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14eb0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
14ec0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
14ed0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
14ee0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
14ef0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
14f00 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
14f10 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
14f20 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
14f30 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
14f40 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
14f50 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
14f60 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
14f70 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
14f80 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14f90 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
14fa0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14fb0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
14fc0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
14fd0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
14fe0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
14ff0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
15000 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
15010 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
15020 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
15030 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
15040 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
15050 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
15060 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
15070 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
15080 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
15090 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
150a0 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
150b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
150c0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
150d0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
150e0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
150f0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
15100 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
15110 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
15120 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
15130 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
15140 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
15150 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
15160 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
15170 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
15180 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
15190 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
151a0 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
151b0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
151c0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
151d0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
151e0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
151f0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
15200 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
15210 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
15220 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
15230 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
15240 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
15250 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
15260 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
15270 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
15280 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
15290 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
152a0 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
152b0 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
152c0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
152d0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
152e0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
152f0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
15300 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
15310 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
15320 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
15330 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
15340 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
15350 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
15360 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
15370 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
15380 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
15390 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
153a0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
153b0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
153c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
153d0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
153e0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
153f0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
15400 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15410 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
15420 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
15430 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
15440 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
15450 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
15460 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
15470 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
15480 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
15490 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
154a0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
154b0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
154c0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
154d0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
154e0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
154f0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
15500 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
15510 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
15520 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
15530 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
15540 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
15550 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15560 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15570 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
15580 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
15590 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
155a0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
155b0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
155c0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
155d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
155e0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
155f0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
15600 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
15610 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
15620 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  ;..  /* Use pPag
15630 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
15640 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
15650 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
15660 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
15670 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
15680 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
15690 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
156a0 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
156b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
156c0 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
156d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
156e0 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
156f0 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
15700 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
15710 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
15720 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
15730 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15740 4f 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  Off;..  /* Begin
15750 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
15760 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
15770 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
15780 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
15790 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
157a0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
157b0 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
157c0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
157d0 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
157e0 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
157f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15800 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
15810 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
15820 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
15830 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
15840 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
15850 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
15860 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
15870 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
15880 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
15890 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
158a0 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
158b0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
158c0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
158d0 6e 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  nt ){.    iHdrOf
158e0 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
158f0 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
15900 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
15910 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
15920 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15930 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
15940 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
15950 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
15960 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
15970 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
15980 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
15990 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
159a0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c  _page(pPager, 1,
159b0 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75   0, &pPager->jou
159c0 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e  rnalOff, 1, pDon
159d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  e);.    }.    as
159e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
159f0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
15a00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
15a10 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
15a20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
15a30 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
15a40 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
15a50 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
15a60 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
15a70 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
15a80 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
15a90 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
15aa0 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
15ab0 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
15ac0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
15ad0 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
15ae0 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
15af0 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
15b00 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
15b10 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
15b20 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
15b30 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
15b40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
15b50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
15b60 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
15b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15b80 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15b90 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
15ba0 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
15bb0 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
15bc0 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
15bd0 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
15be0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
15bf0 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e  ager, 0, szJ, &n
15c00 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
15c10 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
15c20 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
15c30 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
15c40 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
15c50 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
15c60 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
15c70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
15c80 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
15c90 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
15ca0 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
15cb0 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
15cc0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
15cd0 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
15ce0 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
15cf0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
15d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
15d10 72 74 28 20 21 28 6e 4a 52 65 63 3d 3d 30 0a 20  rt( !(nJRec==0. 
15d20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
15d30 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
15d40 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
15d50 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)!=pPager->jo
15d60 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20  urnalOff.       
15d70 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61    && ((szJ - pPa
15d80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
15d90 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
15da0 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20  (pPager))>0.    
15db0 20 20 20 20 20 26 26 20 70 61 67 65 72 4e 65 78       && pagerNex
15dc0 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61  tJournalPageIsVa
15dd0 6c 69 64 28 70 50 61 67 65 72 29 29 0a 20 20 20  lid(pPager)).   
15de0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   );.    if( nJRe
15df0 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
15e00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15e10 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
15e20 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
15e30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
15e40 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
15e50 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
15e60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15e70 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
15e80 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
15e90 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
15ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
15eb0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
15ec0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
15ed0 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
15ee0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
15ef0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
15f00 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67  ger, 1, 0, &pPag
15f10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
15f20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d  1, pDone);.    }
15f30 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
15f40 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
15f50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
15f60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
15f70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15f80 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20  f==szJ );..  /* 
15f90 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61  Finally,  rollba
15fa0 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ck pages from th
15fb0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20  e sub-journal.  
15fc0 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20  Page that were. 
15fd0 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72   ** previously r
15fe0 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f  olled back out o
15ff0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
16000 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63  al (and are henc
16010 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a  e in pDone).  **
16020 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
16030 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  .  Out-of-range 
16040 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73  pages are also s
16050 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  kipped..  */.  i
16060 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
16070 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20  .    u32 ii;    
16080 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
16090 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
160a0 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76  64 offset = pSav
160b0 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
160c0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
160d0 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 69  ize);.    for(ii
160e0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
160f0 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
16100 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
16110 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
16120 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16130 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50  offset==ii*(4+pP
16140 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
16150 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
16160 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
16170 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c  _page(pPager, 0,
16180 20 30 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c 20   0, &offset, 1, 
16190 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pDone);.    }.  
161a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
161b0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
161c0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
161d0 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
161e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
161f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
16200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
16210 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75   szJ;.  }.  retu
16220 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16230 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
16240 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
16250 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
16260 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
16270 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
16280 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
16290 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
162a0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
162b0 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
162c0 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
162d0 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
162e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
162f0 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
16300 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16310 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
16320 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
16330 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
16340 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
16350 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
16360 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
16370 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
16380 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
16390 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
163a0 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
163b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
163c0 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
163d0 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
163e0 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
16400 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
16410 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
16420 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
16430 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
16440 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
16450 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
16460 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
16470 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
16480 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
16490 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
164a0 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
164c0 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
164d0 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
164e0 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
164f0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
16500 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
16510 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
16520 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
16530 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
16540 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
16550 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
16560 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
16570 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
16580 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
16590 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
165a0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
165b0 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
165c0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
165d0 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
165e0 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
165f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16600 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
16610 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
16620 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
16630 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
16650 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
16660 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
16670 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
16680 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
16690 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
166a0 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
166b0 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
166c0 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
166d0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
166e0 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
166f0 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
16700 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16710 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
16720 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
16730 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
16740 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
16750 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
16760 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
16770 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16780 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
16790 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
167a0 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
167b0 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
167c0 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
167d0 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
167e0 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
167f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16800 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
16810 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
16820 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61  etSafetyLevel(Pa
16830 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
16840 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c   level, int bFul
16850 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  lFsync){.  pPage
16860 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
16870 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
16880 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
16890 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
168a0 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
168b0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
168c0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
168d0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
168e0 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f  s = (bFullFsync?
168f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
16900 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  :SQLITE_SYNC_NOR
16910 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  MAL);.  if( pPag
16920 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
16930 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
16940 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
16950 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
16960 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
16970 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
16980 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
16990 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
169a0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
169b0 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
169c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
169d0 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
169e0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
169f0 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
16a00 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
16a10 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
16a20 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
16a30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
16a40 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
16a50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
16a60 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
16a70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
16a80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
16a90 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
16aa0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
16ab0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
16ac0 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
16ad0 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
16ae0 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
16af0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
16b00 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
16b10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
16b20 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
16b30 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
16b40 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
16b50 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
16b60 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
16b70 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
16b80 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
16b90 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
16ba0 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
16bb0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
16bc0 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
16bd0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
16be0 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
16bf0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
16c00 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
16c10 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
16c20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16c30 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
16c40 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
16c50 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16c60 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
16c70 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
16c80 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
16c90 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
16ca0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
16cb0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
16cc0 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
16cd0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
16ce0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16cf0 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
16d00 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
16d10 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
16d20 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
16d30 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
16d40 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
16d50 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
16d60 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
16d70 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
16d80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16d90 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
16da0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
16db0 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
16dc0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
16dd0 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
16de0 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
16df0 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
16e00 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
16e10 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
16e20 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
16e30 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
16e40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16e50 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
16e60 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
16e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
16e80 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
16e90 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
16ea0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
16eb0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
16ec0 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
16ed0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
16ee0 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
16ef0 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
16f00 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
16f10 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
16f20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
16f30 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
16f40 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
16f50 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
16f60 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
16f70 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
16f80 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
16f90 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
16fa0 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
16fb0 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
16fc0 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
16fd0 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
16fe0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
16ff0 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
17000 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
17030 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
17040 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17070 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
17080 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
17090 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
170a0 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
170b0 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
170c0 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
170d0 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
170e0 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
170f0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
17100 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
17110 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
17120 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
17130 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
17140 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
17150 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
17160 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
17170 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
17180 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
17190 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
171a0 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
171b0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
171c0 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
171d0 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
171e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
171f0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
17200 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
17210 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
17220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17230 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
17240 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
17250 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
17260 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17270 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
17280 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
17290 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
172a0 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
172b0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
172c0 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
172d0 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a  Handler */.){  .
172e0 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
172f0 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
17300 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
17310 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
17320 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
17330 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  rg;.}../*.** Rep
17340 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
17350 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75  page size and nu
17360 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
17370 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74   bytes back.** t
17380 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a  o the codec..*/.
17390 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
173a0 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76  S_CODEC.static v
173b0 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53  oid pagerReportS
173c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
173d0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
173e0 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
173f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
17400 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70  xCodecSizeChng(p
17410 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70  Pager->pCodec, p
17420 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
17430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17440 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
17450 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76  )pPager->nReserv
17460 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  e);.  }.}.#else.
17470 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65  # define pagerRe
17480 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20  portSize(X)     
17490 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64  /* No-op if we d
174a0 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20  o not support a 
174b0 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a  codec */.#endif.
174c0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
174d0 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
174e0 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62   by the Pager ob
174f0 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61  ject. The new pa
17500 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70  ge size .** is p
17510 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53  assed in *pPageS
17520 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
17530 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
17540 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  e error state wh
17550 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
17560 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a   is called, it.*
17570 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  * is a no-op. Th
17580 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
17590 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74   is the error st
175a0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28  ate error code (
175b0 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20  i.e. .** one of 
175c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
175d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
175e0 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a  SQLITE_FULL)..**
175f0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
17600 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
17610 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
17620 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e  .**.**   * the n
17630 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61  ew page size (va
17640 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a  lue of *pPageSiz
17650 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70  e) is valid (a p
17660 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20  ower .**     of 
17670 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20  two between 512 
17680 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  and SQLITE_MAX_P
17690 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73  AGE_SIZE, inclus
176a0 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ive), and.**.** 
176b0 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f    * there are no
176c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
176d0 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e  e references, an
176e0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  d.**.**   * the 
176f0 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68  database is eith
17700 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  er not an in-mem
17710 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20  ory database or 
17720 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20  it is.**     an 
17730 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
17740 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  se that currentl
17750 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65  y consists of ze
17760 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ro pages..**.** 
17770 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f  then the pager o
17780 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20  bject page size 
17790 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65  is set to *pPage
177a0 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
177b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
177c0 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68  changed, then th
177d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  is function uses
177e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c   sqlite3PagerMal
177f0 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74  loc() .** to obt
17800 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e  ain a new Pager.
17810 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
17820 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61  . If this alloca
17830 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a  tion attempt .**
17840 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
17850 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
17860 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69   and the page si
17870 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61  ze remains uncha
17880 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c  nged. .** In all
17890 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51   other cases, SQ
178a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
178b0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
178c0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
178d0 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68  ot changed, eith
178e0 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f  er because one o
178f0 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64  f the enumerated
17900 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61  .** conditions a
17910 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65  bove is not true
17920 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  , the pager was 
17930 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
17940 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hen this.** func
17950 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c  tion was called,
17960 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20   or because the 
17970 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
17980 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64  n attempt failed
17990 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67  , .** then *pPag
179a0 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  eSize is set to 
179b0 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65  the old, retaine
179c0 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f  d page size befo
179d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
179e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
179f0 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
17a00 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
17a10 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  *pPageSize, int 
17a20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74  nReserve){.  int
17a30 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
17a40 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72 63  rCode;..  if( rc
17a50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17a60 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20     u16 pageSize 
17a70 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
17a80 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
17a90 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
17aa0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
17ab0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
17ac0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
17ad0 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d    if( (pPager->m
17ae0 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
17af0 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
17b00 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
17b10 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
17b20 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
17b30 0a 20 20 20 20 20 26 26 20 70 61 67 65 53 69 7a  .     && pageSiz
17b40 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70  e && pageSize!=p
17b50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
17b60 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68  .    ){.      ch
17b70 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
17b80 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
17b90 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
17ba0 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
17bb0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
17bc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17be0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17bf0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17c00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17c10 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
17c20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
17c30 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
17c40 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  pSpace);.       
17c50 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
17c60 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
17c70 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17c80 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
17c90 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
17ca0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
17cb0 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65      }.    *pPage
17cc0 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67  Size = (u16)pPag
17cd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
17ce0 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
17cf0 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
17d00 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
17d10 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
17d20 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
17d30 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
17d40 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17d50 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
17d60 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
17d70 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
17d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17d90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17da0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
17db0 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
17dc0 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
17dd0 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
17de0 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
17df0 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
17e00 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
17e10 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
17e20 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
17e30 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
17e40 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
17e50 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
17e60 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
17e70 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
17e80 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
17e90 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
17ea0 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
17eb0 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
17ec0 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
17ed0 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
17ee0 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
17ef0 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
17f00 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
17f10 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
17f20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17f30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
17f40 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
17f50 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
17f60 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
17f70 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
17f80 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
17f90 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
17fa0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
17fb0 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
17fc0 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
17fd0 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
17fe0 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
17ff0 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
18000 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
18010 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
18020 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
18030 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
18040 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
18050 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
18060 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
18070 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
18080 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
18090 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
180a0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
180b0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
180c0 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
180d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65   }.  sqlite3Page
180e0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
180f0 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r, 0);.  return 
18100 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
18110 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
18120 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
18130 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
18140 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
18150 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
18160 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
18170 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
18180 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
18190 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
181a0 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
181b0 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
181c0 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
181d0 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
181e0 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
181f0 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
18200 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
18210 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
18220 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
18230 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
18240 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
18250 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
18260 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
18270 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
18280 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
18290 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
182a0 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
182b0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
182c0 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
182d0 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
182e0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
182f0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
18300 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
18310 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
18320 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
18330 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
18340 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
18350 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
18360 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
18370 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
18380 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
18390 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
183a0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
183b0 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
183c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
183d0 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
183e0 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
183f0 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
18400 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
18410 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
18420 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  o. .**.** If the
18430 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65   pager was opene
18440 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  d on a transient
18450 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65   file (zFilename
18460 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65  ==""), or.** ope
18470 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65  ned on a file le
18480 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20  ss than N bytes 
18490 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74  in size, the out
184a0 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  put buffer is.**
184b0 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49   zeroed and SQLI
184c0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
184d0 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f  The rationale fo
184e0 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
184f0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
18500 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
18510 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
18520 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61  s, and a new tra
18530 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72  nsient or.** zer
18540 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65  o sized database
18550 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68   has a header th
18560 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  an consists enti
18570 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a  rely of zeroes..
18580 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20  **.** If any IO 
18590 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d  error apart from
185a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
185b0 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f  ORT_READ is enco
185c0 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20  untered,.** the 
185d0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
185e0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
185f0 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e  ller and the con
18600 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
18610 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e  output buffer un
18620 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
18630 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
18640 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
18650 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
18660 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18670 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
18680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18690 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
186a0 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69   N);.  assert( i
186b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
186c0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
186d0 70 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69  pFile );.  if( i
186e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
186f0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
18700 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
18710 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
18720 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18730 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
18740 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
18750 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
18760 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
18770 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
18780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18790 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
187a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
187b0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
187c0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
187d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
187e0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
187f0 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e  .** with pPager.
18800 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
18810 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  is calculated as
18820 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e   (<db file size>
18830 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a  /<page-size>)..*
18840 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
18850 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
18860 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
18870 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
18880 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
18890 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
188a0 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a   1 page file..**
188b0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
188c0 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61   is in error sta
188d0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
188e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
188f0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72   then the.** err
18900 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
18910 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
18920 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74  and *pnPage left
18930 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a   unchanged. Or,.
18940 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ** if the file s
18950 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20  ystem has to be 
18960 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20  queried for the 
18970 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
18980 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72   and.** the quer
18990 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e  y attempt return
189a0 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74  s an IO error, t
189b0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
189c0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
189d0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
189e0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
189f0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
18a00 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
18a10 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
18a20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
18a30 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
18a40 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  pnPage is set to
18a50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
18a60 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
18a70 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
18a80 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
18a90 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
18aa0 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
18ab0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
18ad0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
18ae0 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
18af0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
18b00 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
18b10 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
18b20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
18b30 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20   code. */.  if( 
18b40 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
18b50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
18b60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
18b70 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69   }..  /* Determi
18b80 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ne the number of
18b90 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
18ba0 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69  le. Store this i
18bb0 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66  n nPage. */.  if
18bc0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18bd0 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61  Valid ){.    nPa
18be0 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ge = pPager->dbS
18bf0 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
18c00 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
18c20 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  or returned by O
18c30 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20  sFileSize() */. 
18c40 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20     i64 n = 0;   
18c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18c60 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  le size in bytes
18c70 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
18c80 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20  ileSize() */..  
18c90 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
18ca0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
18cb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
18cc0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
18cd0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26  en(pPager->fd) &
18ce0 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  & (0 != (rc = sq
18cf0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
18d00 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29  pPager->fd, &n))
18d10 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
18d20 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
18d30 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
18d40 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
18d50 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
18d60 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
18d70 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b        nPage = 1;
18d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18d90 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29    nPage = (Pgno)
18da0 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  (n / pPager->pag
18db0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
18dc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18dd0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
18de0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
18df0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
18e00 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
18e10 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
18e20 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  age;.      pPage
18e30 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
18e40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
18e50 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
18e60 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
18e70 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
18e80 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
18e90 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  he .  ** configu
18ea0 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
18eb0 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
18ec0 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
18ed0 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
18ee0 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
18ef0 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
18f00 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
18f10 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
18f20 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
18f30 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
18f40 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
18f50 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61  utput variable a
18f60 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
18f70 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50  _OK */.  if( pnP
18f80 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61  age ){.    *pnPa
18f90 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ge = nPage;.  }.
18fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18fb0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  OK;.}.../*.** Tr
18fc0 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
18fd0 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
18fe0 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
18ff0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
19000 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
19010 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
19020 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
19030 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
19040 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
19050 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
19060 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
19070 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
19080 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
19090 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
190a0 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
190b0 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
190c0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
190d0 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
190e0 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
190f0 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
19100 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
19110 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
19120 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
19130 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
19140 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
19150 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
19160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
19170 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
19180 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
19190 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
191a0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
191b0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
191c0 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
191d0 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
191e0 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
191f0 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
19200 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
19210 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
19220 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
19230 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
19240 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
19250 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
19280 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
19290 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
192a0 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
192b0 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
192c0 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
192d0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
192e0 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
192f0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
19300 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
19310 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
19320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
19330 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
19340 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
19350 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
19360 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
19370 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
19380 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
19390 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
193a0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
193b0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
193c0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
193d0 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Valid==0 );..  /
193e0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
193f0 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
19400 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
19410 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
19420 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
19430 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66   held, or one of
19440 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e   the transistion
19450 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
19460 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
19470 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
19480 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
19490 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
194a0 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
194b0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
194c0 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
194d0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74  ert( (pPager->st
194e0 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ate>=locktype). 
194f0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
19500 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
19510 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  NLOCK && locktyp
19520 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29  e==PAGER_SHARED)
19530 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
19540 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
19550 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63  _RESERVED && loc
19560 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43  ktype==PAGER_EXC
19570 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20  LUSIVE).  );..  
19580 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
19590 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
195a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
195b0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
195c0 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
195d0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
195e0 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
195f0 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
19600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
19610 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
19620 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
19630 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
19640 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
19650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19660 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
19670 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
19680 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
19690 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
196a0 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
196b0 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
196c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
196d0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
196e0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
196f0 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
19700 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
19710 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
19720 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
19730 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
19740 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
19750 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
19760 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
19770 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
19780 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
19790 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
197a0 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
197b0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
197c0 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
197d0 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
197e0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
197f0 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
19800 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
19810 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
19820 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
19830 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
19840 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
19850 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
19860 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
19870 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
19880 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
19890 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
198a0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
198b0 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
198c0 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
198d0 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
198e0 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
198f0 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
19900 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
19910 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
19920 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
19930 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
19940 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
19950 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
19960 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
19970 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19980 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
19990 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
199a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
199b0 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
199c0 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
199d0 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c  t behaviour woul
199e0 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
199f0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
19a00 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
19a10 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
19a20 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
19a30 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
19a40 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
19a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
19a60 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
19a70 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
19a80 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
19a90 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
19aa0 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
19ab0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
19ac0 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
19ad0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
19ae0 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
19af0 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
19b00 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
19b10 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
19b20 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
19b30 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
19b40 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19b50 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
19b60 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
19b70 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
19b80 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
19b90 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
19ba0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
19bb0 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
19bc0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
19bd0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
19be0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
19bf0 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
19c00 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
19c10 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
19c20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
19c30 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
19c40 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
19c50 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
19c60 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
19c70 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
19c80 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
19c90 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
19ca0 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
19cb0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
19cc0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
19cd0 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
19ce0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
19cf0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
19d00 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
19d10 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
19d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
19d30 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
19d40 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
19d50 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
19d60 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
19d70 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
19d80 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
19d90 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
19da0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
19db0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
19dc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19dd0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
19de0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
19df0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
19e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19e10 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
19e20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19e30 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
19e40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19e50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
19e60 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
19e70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
19e80 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72  = nPage;.  asser
19e90 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
19ea0 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  int(pPager);.}..
19eb0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
19ec0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
19ed0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
19ee0 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
19ef0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
19f00 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
19f10 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
19f20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19f30 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
19f40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19f50 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
19f60 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
19f70 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
19f80 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
19f90 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
19fa0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
19fb0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
19fc0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
19fd0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
19fe0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
19ff0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
1a000 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
1a010 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
1a020 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1a030 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
1a040 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
1a050 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
1a060 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
1a070 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
1a080 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
1a090 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
1a0a0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
1a0b0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
1a0c0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
1a0d0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
1a0e0 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
1a0f0 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
1a100 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
1a110 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
1a120 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
1a130 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  ){.  disable_sim
1a140 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1a150 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
1a160 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
1a170 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
1a180 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
1a190 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1a1a0 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
1a1b0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
1a1c0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1a1d0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
1a1e0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
1a1f0 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e     /* Set Pager.
1a200 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31  journalHdr to -1
1a210 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74   for the benefit
1a220 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c   of the pager_pl
1a230 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a  ayback() .    **
1a240 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20   call which may 
1a250 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74  be made from wit
1a260 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  hin pagerUnlockA
1a270 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66  ndRollback(). If
1a280 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
1a290 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75  t -1, then the u
1a2a0 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
1a2b0 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  of an open journ
1a2c0 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20  al file may.    
1a2d0 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ** be played bac
1a2e0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
1a2f0 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
1a300 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
1a310 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
1a320 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
1a330 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1a340 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
1a350 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
1a360 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
1a370 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  -1;.    pagerUnl
1a380 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
1a390 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
1a3a0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
1a3b0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
1a3c0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
1a3d0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
1a3e0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
1a3f0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1a400 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
1a410 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
1a420 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
1a430 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1a440 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
1a450 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
1a460 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
1a470 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
1a480 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1a490 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
1a4a0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
1a4b0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
1a4c0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
1a4d0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
1a4e0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
1a4f0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
1a500 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
1a510 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
1a520 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
1a530 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
1a540 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
1a550 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1a560 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
1a570 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
1a580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a590 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
1a5a0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
1a5b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1a5c0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1a5d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1a5e0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1a5f0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
1a600 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
1a610 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1a620 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
1a630 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a640 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
1a650 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1a660 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
1a670 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1a680 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
1a690 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
1a6a0 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
1a6b0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
1a6c0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
1a6d0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
1a6e0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
1a6f0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
1a700 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1a710 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
1a720 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
1a730 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
1a740 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
1a750 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
1a760 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
1a770 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1a780 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1a790 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1a7a0 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c  flag is not set,
1a7b0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1a7c0 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
1a7d0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1a7e0 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
1a7f0 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
1a800 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a   journal-mode.**
1a810 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20   and the device 
1a820 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1a830 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
1a840 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
1a850 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
1a860 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a870 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
1a880 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
1a890 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
1a8a0 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
1a8b0 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
1a8c0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
1a8d0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
1a8e0 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
1a8f0 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
1a900 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
1a910 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1a920 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1a930 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1a940 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
1a950 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
1a960 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a970 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
1a980 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
1a990 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
1a9a0 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
1a9b0 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
1a9c0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
1a9d0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
1a9e0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1a9f0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
1aa00 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
1aa10 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
1aa20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
1aa30 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1aa40 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
1aa50 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
1aa60 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
1aa70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1aa80 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
1aa90 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
1aaa0 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
1aab0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1aac0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
1aad0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
1aae0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
1aaf0 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
1ab00 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
1ab10 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1ab20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
1ab30 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
1ab40 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
1ab50 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
1ab60 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
1ab70 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
1ab80 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64  * The Pager.need
1ab90 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76  Sync flag is nev
1aba0 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65  er be set for te
1abb0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f  mporary files, o
1abc0 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70  r any.** file op
1abd0 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  erating in no-sy
1abe0 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e  nc mode (Pager.n
1abf0 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e  oSync set to non
1ac00 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  -zero)..**.** If
1ac10 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
1ac20 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
1ac30 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1ac40 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
1ac50 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
1ac60 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
1ac70 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
1ac80 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
1ac90 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
1aca0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1acb0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
1acc0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1acd0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1ace0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1acf0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
1ad00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ad10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
1ad20 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  dSync ){.    ass
1ad30 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
1ad40 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1ad50 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ad60 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1ad70 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
1ad80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1adb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1adc0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
1add0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1ade0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1adf0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1ae00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ae10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1ae20 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
1ae30 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1ae40 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1ae50 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
1ae60 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
1ae70 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
1ae80 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
1ae90 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
1aea0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
1aeb0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
1aec0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
1aed0 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
1aee0 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
1aef0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
1af00 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1af10 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
1af20 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
1af30 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
1af40 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1af50 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
1af60 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
1af70 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
1af80 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1af90 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
1afa0 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
1afb0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
1afc0 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
1afd0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
1afe0 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61  nnections transa
1aff0 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
1b000 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
1b010 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
1b020 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
1b030 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
1b040 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
1b050 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
1b060 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
1b070 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
1b080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1b090 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
1b0a0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
1b0b0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1b0c0 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
1b0d0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
1b0e0 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
1b0f0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
1b100 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1b110 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
1b120 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
1b130 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
1b140 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
1b150 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
1b160 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
1b170 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
1b180 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
1b190 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
1b1a0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
1b1b0 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
1b1c0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
1b1d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1b1e0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1b1f0 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
1b200 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
1b210 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
1b220 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
1b230 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
1b240 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
1b250 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
1b260 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
1b270 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
1b280 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
1b290 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
1b2a0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
1b2b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1b2c0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
1b2d0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
1b2e0 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
1b2f0 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
1b300 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
1b310 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
1b320 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
1b330 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
1b340 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
1b350 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
1b360 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
1b370 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
1b380 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
1b390 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
1b3a0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
1b3b0 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
1b3c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
1b3d0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
1b3e0 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
1b3f0 69 63 5b 38 5d 3b 0a 09 75 38 20 7a 48 65 61 64  ic[8];..u8 zHead
1b400 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
1b410 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 09 6d  alMagic)+4];...m
1b420 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
1b430 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
1b440 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1b450 69 63 29 29 3b 0a 09 70 75 74 33 32 62 69 74 73  ic));..put32bits
1b460 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
1b470 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
1b480 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
1b490 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
1b4a0 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
1b4b0 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
1b4c0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
1b4d0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1b4e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
1b4f0 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
1b500 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
1b510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b520 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
1b530 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
1b540 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
1b550 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
1b560 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
1b570 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
1b580 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1b590 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
1b5a0 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
1b5b0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1b5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b5d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b5e0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1b5f0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1b600 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
1b610 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b620 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
1b630 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
1b640 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
1b650 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
1b660 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
1b670 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
1b680 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
1b690 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
1b6a0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
1b6b0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
1b6c0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
1b6d0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
1b6e0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
1b6f0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
1b700 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
1b710 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
1b720 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
1b730 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1b740 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
1b750 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
1b760 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
1b770 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
1b780 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
1b790 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
1b7a0 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
1b7b0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
1b7c0 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
1b7d0 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
1b7e0 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
1b7f0 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
1b800 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
1b810 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
1b820 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
1b830 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
1b840 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
1b850 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
1b860 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
1b870 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
1b880 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1b890 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b8a0 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
1b8b0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1b8c0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1b8d0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
1b8e0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
1b8f0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
1b900 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
1b910 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
1b920 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
1b930 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
1b940 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b950 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1b960 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
1b970 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  c_flags);.      
1b980 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b990 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1b9a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1b9b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1b9c0 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
1b9d0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1b9e0 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
1b9f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ba00 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
1ba10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1ba20 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
1ba30 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
1ba40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1ba50 0a 09 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ..);.        if(
1ba60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ba70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ba80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
1ba90 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1baa0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
1bab0 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
1bac0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
1bad0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
1bae0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
1baf0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
1bb00 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1bb10 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1bb20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1bb30 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1bb40 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1bb50 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
1bb60 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  (pPager->sync_fl
1bb70 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
1bb80 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
1bb90 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
1bba0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1bbb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bbc0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1bbd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bbe0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
1bbf0 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
1bc00 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
1bc10 63 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e  ced. Set Pager.n
1bc20 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
1bc30 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61  to zero and clea
1bc40 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
1bc50 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c  _SYNC flag on al
1bc60 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f  l pagess..    */
1bc70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
1bc80 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
1bc90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1bca0 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 73  arted = 1;.    s
1bcb0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
1bcc0 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
1bcd0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
1bce0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1bcf0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1bd00 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1bd10 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
1bd20 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
1bd30 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
1bd40 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
1bd50 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
1bd60 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1bd70 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
1bd80 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
1bd90 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
1bda0 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
1bdb0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1bdc0 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
1bdd0 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
1bde0 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
1bdf0 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
1be00 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
1be10 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
1be20 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
1be30 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
1be40 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
1be50 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
1be60 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
1be70 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
1be80 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
1be90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bea0 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
1beb0 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
1bec0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1bed0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
1bee0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
1bef0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1bf00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1bf10 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
1bf20 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
1bf30 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
1bf40 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1bf50 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
1bf60 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
1bf70 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
1bf80 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
1bf90 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
1bfa0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
1bfb0 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
1bfc0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
1bfd0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
1bfe0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
1bff0 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
1c000 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
1c010 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
1c020 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
1c030 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
1c040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1c050 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
1c060 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
1c070 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
1c080 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
1c090 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1c0a0 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
1c0b0 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
1c0c0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1c0d0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
1c0e0 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
1c0f0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
1c100 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
1c110 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
1c120 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
1c130 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
1c140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1c150 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
1c160 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
1c170 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
1c180 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
1c190 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
1c1a0 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
1c1b0 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
1c1c0 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
1c1d0 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
1c1e0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
1c1f0 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
1c200 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1c210 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
1c220 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
1c230 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c240 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
1c250 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1c260 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
1c270 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1c280 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
1c290 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
1c2a0 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
1c2b0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
1c2c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1c2d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
1c2e0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
1c2f0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
1c300 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1c330 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ect */.  int rc;
1c340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c360 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c370 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69  .  if( NEVER(pLi
1c380 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  st==0) ) return 
1c390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
1c3a0 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
1c3b0 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
1c3c0 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
1c3d0 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
1c3e0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
1c3f0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1c400 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
1c410 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
1c420 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
1c430 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
1c440 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
1c450 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
1c460 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
1c470 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
1c480 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
1c490 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
1c4a0 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
1c4b0 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
1c4c0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
1c4d0 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
1c4e0 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
1c4f0 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
1c500 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
1c510 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1c520 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
1c530 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
1c540 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
1c550 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
1c560 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
1c570 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
1c580 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
1c590 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
1c5a0 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
1c5b0 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
1c5c0 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
1c5d0 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
1c5e0 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
1c5f0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
1c600 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1c610 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
1c620 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
1c630 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
1c640 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
1c650 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
1c660 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
1c670 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
1c680 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
1c690 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
1c6a0 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
1c6b0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1c6c0 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
1c6d0 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
1c6e0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
1c6f0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
1c700 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
1c710 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1c720 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1c730 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1c740 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1c750 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1c760 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1c770 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1c780 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
1c790 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
1c7a0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
1c7b0 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
1c7c0 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
1c7d0 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
1c7e0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1c7f0 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
1c800 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
1c810 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
1c820 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
1c830 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
1c840 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
1c850 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
1c860 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
1c870 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
1c880 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
1c890 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
1c8a0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
1c8b0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
1c8c0 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
1c8d0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  ags);.  }..  whi
1c8e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1c8f0 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
1c900 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c    Pgno pgno = pL
1c910 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20  ist->pgno;..    
1c920 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1c930 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
1c940 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
1c950 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
1c960 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
1c970 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1c980 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
1c990 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1c9a0 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
1c9b0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
1c9c0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
1c9d0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
1c9e0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
1c9f0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
1ca00 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
1ca10 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
1ca20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
1ca30 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74   ** Also, do not
1ca40 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70   write out any p
1ca50 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65  age that has the
1ca60 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
1ca70 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65  E flag.    ** se
1ca80 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65  t (set by sqlite
1ca90 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1caa0 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ))..    */.    i
1cab0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
1cac0 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
1cad0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
1cae0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
1caf0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
1cb00 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1cb10 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1cb20 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ze;   /* Offset 
1cb30 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
1cb40 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb70 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
1cb80 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20  e */    ..      
1cb90 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61  /* Encode the da
1cba0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
1cbb0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1cbc0 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
1cbd0 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 6, return SQL
1cbe0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
1cbf0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
1cc00 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
1cc10 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
1cc20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1cc30 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1cc40 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
1cc50 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
1cc60 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
1cc70 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
1cc80 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
1cc90 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
1cca0 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
1ccb0 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
1ccc0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
1ccd0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
1cce0 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
1ccf0 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
1cd00 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1cd10 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
1cd20 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
1cd30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1cd40 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1cd50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1cd60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1cd70 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
1cd80 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1cd90 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1cda0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
1cdb0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
1cdc0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
1cdd0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
1cde0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
1cdf0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70    }..      /* Up
1ce00 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
1ce10 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
1ce20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1ce30 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
1ce40 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
1ce50 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
1ce60 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
1ce70 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
1ce80 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
1ce90 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
1cea0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1ceb0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1cec0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1ced0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1cee0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1cef0 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
1cf00 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
1cf10 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1cf20 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
1cf30 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1cf40 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
1cf50 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
1cf60 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1cf70 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
1cf80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
1cf90 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
1cfa0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
1cfb0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1cfc0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
1cfd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1cfe0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c  ECK_PAGES.    pL
1cff0 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  ist->pageHash = 
1d000 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1d010 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  List);.#endif.  
1d020 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
1d030 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20  >pDirty;.  }..  
1d040 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d050 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
1d060 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
1d070 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
1d080 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
1d090 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
1d0a0 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
1d0b0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
1d0c0 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
1d0d0 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
1d0e0 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
1d0f0 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
1d100 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
1d110 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1d120 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1d130 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
1d140 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
1d150 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
1d160 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
1d170 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
1d180 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
1d190 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
1d1a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1d1b0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
1d1c0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
1d1d0 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
1d1e0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
1d1f0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
1d200 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
1d210 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
1d220 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
1d230 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
1d240 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
1d250 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
1d260 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
1d270 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
1d280 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
1d290 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
1d2a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d2b0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1d2c0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1d2d0 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
1d2e0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
1d2f0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
1d300 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
1d310 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
1d320 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
1d330 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
1d340 7a 65 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  ze);.    char *p
1d350 44 61 74 61 32 3b 0a 0a 20 20 20 20 43 4f 44 45  Data2;..    CODE
1d360 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1d370 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
1d380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1d390 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
1d3a0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1d3b0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
1d3c0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1d3d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1d3e0 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20 20  >pgno));.  .    
1d3f0 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
1d400 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
1d410 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1d420 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
1d430 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
1d440 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  ts(pPager->sjfd,
1d450 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
1d460 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  no);.    if( rc=
1d470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d490 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1d4a0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
1d4b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1d4c0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 7d  offset+4);.    }
1d4d0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d4e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d4f0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b  pPager->nSubRec+
1d500 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
1d510 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
1d520 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
1d530 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
1d540 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
1d550 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
1d560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1d570 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d580 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
1d590 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
1d5a0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
1d5b0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
1d5c0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
1d5d0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1d5e0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1d5f0 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
1d600 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
1d610 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
1d620 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
1d630 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
1d640 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
1d650 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
1d660 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
1d670 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
1d680 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
1d690 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1d6a0 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
1d6b0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1d6c0 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
1d6d0 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
1d6e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
1d6f0 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
1d700 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
1d710 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
1d720 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
1d730 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
1d740 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
1d750 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
1d760 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
1d770 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d780 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
1d790 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
1d7a0 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
1d7b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1d7c0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
1d7d0 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
1d7e0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
1d7f0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
1d800 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
1d810 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d820 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1d830 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
1d840 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
1d850 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
1d860 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1d870 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1d880 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
1d890 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
1d8a0 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
1d8b0 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
1d8c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1d8d0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
1d8e0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
1d8f0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1d900 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
1d910 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
1d920 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
1d930 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
1d940 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1d950 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1d960 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
1d970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1d980 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
1d990 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
1d9a0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
1d9b0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
1d9c0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
1d9d0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
1d9e0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50   by the sqlite3P
1d9f0 61 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63  agerWrite() func
1da00 74 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20  tion while it.  
1da10 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e  ** is journallin
1da20 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20 6f  g a set of two o
1da30 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65 20  r more database 
1da40 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 73  pages that are s
1da50 74 6f 72 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  tored.  ** on th
1da60 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63 74  e same disk sect
1da70 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68 65 20  or. Syncing the 
1da80 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1da90 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20 20 2a  llowed while.  *
1daa0 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
1dab0 69 6e 67 20 61 73 20 69 74 20 69 73 20 69 6d 70  ing as it is imp
1dac0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
1dad0 6d 65 6d 62 65 72 73 20 6f 66 20 73 75 63 68 20  members of such 
1dae0 61 0a 20 20 2a 2a 20 73 65 74 20 6f 66 20 70 61  a.  ** set of pa
1daf0 67 65 73 20 61 72 65 20 73 79 6e 63 65 64 20 74  ges are synced t
1db00 6f 20 64 69 73 6b 20 74 6f 67 65 74 68 65 72 2e  o disk together.
1db10 20 53 6f 2c 20 69 66 20 74 68 65 20 70 61 67 65   So, if the page
1db20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
1db30 20 2a 2a 20 69 73 20 74 72 79 69 6e 67 20 74 6f   ** is trying to
1db40 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c   make clean will
1db50 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1db60 61 6c 20 73 79 6e 63 20 61 6e 64 20 74 68 65 20  al sync and the 
1db70 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 2a 2a 20 66  doNotSync.  ** f
1db80 6c 61 67 20 69 73 20 73 65 74 2c 20 72 65 74 75  lag is set, retu
1db90 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
1dba0 20 61 6e 79 74 68 69 6e 67 2e 20 54 68 65 20 70   anything. The p
1dbb0 63 61 63 68 65 20 6c 61 79 65 72 20 77 69 6c 6c  cache layer will
1dbc0 0a 20 20 2a 2a 20 6a 75 73 74 20 68 61 76 65 20  .  ** just have 
1dbd0 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  to go ahead and 
1dbe0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
1dbf0 61 67 65 20 62 75 66 66 65 72 20 69 6e 73 74 65  age buffer inste
1dc00 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 75 73 69  ad of.  ** reusi
1dc10 6e 67 20 70 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a  ng pPg..  **.  *
1dc20 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20  * Similarly, if 
1dc30 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
1dc40 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
1dc50 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
1dc60 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74  o not.  ** try t
1dc70 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  o write the cont
1dc80 65 6e 74 73 20 6f 66 20 70 50 67 20 74 6f 20 64  ents of pPg to d
1dc90 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
1dca0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1dcb0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  || (pPager->doNo
1dcc0 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c  tSync && pPg->fl
1dcd0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1dce0 59 4e 43 29 20 29 7b 0a 20 20 20 20 72 65 74 75  YNC) ){.    retu
1dcf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1dd00 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  }..  /* Sync the
1dd10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1dd20 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
1dd30 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
1dd40 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
1dd50 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a  {.    rc = syncJ
1dd60 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1dd70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dd80 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1dd90 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20  >fullSync && .  
1dda0 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f      !(pPager->jo
1ddb0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
1ddc0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1ddd0 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 21 28  ORY) &&.      !(
1dde0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1ddf0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1de00 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
1de10 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1de20 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  END).    ){.    
1de30 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
1de40 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
1de50 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1de60 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1de70 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
1de80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1de90 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
1dea0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1deb0 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20  nt size of.  ** 
1dec0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1ded0 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
1dee0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
1def0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1df00 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62  ..  ** This is b
1df10 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
1df20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  to pager_write_p
1df30 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20  agelist() below 
1df40 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63  will not.  ** ac
1df50 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
1df60 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
1df70 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
1df80 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  .  ** Consider t
1df90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71  he following seq
1dfa0 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a  uence of events:
1dfb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47  .  **.  **   BEG
1dfc0 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  IN;.  **     <jo
1dfd0 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
1dfe0 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
1dff0 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20  age X>.  **     
1e000 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20  SAVEPOINT sp;.  
1e010 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
1e020 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1e030 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20  o Y pages>.  ** 
1e040 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
1e050 73 28 70 61 67 65 20 58 29 0a 20 20 2a 2a 20 20  s(page X).  **  
1e060 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
1e070 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  p;.  **.  ** If 
1e080 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
1e090 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
1e0a0 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
1e0b0 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
1e0c0 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68  n.  ** out to th
1e0d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1e0e0 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
1e0f0 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
1e100 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20  che. Then,.  ** 
1e110 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
1e120 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
1e130 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
1e140 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
1e150 61 64 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ad.  ** data fro
1e160 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1e170 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ile. This will b
1e180 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61  e the copy of pa
1e190 67 65 20 58 20 61 73 20 69 74 0a 20 20 2a 2a 20  ge X as it.  ** 
1e1a0 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
1e1b0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1e1c0 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
1e1d0 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
1e1e0 73 70 22 0a 20 20 2a 2a 20 77 61 73 20 65 78 65  sp".  ** was exe
1e1f0 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cuted..  **.  **
1e200 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
1e210 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
1e220 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70  rrent data for p
1e230 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a  age X into the .
1e240 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
1e250 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
1e260 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1e270 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
1e280 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  it will.  ** be 
1e290 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1e2a0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
1e2b0 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
1e2c0 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 2a 2a   TO sp" is .  **
1e2d0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
1e2e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e2f0 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
1e300 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
1e310 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
1e320 61 67 65 28 70 50 67 29 20 29 7b 0a 61 73 73 65  age(pPg) ){.asse
1e330 72 74 28 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  rt(0);.    rc = 
1e340 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
1e350 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  Pg);.  }..  /* W
1e360 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
1e370 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
1e380 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1e390 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28  e file. */.  if(
1e3a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e3b0 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  {.    pPg->pDirt
1e3c0 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
1e3d0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1e3e0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  list(pPg);.  }..
1e3f0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
1e400 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
1e410 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e420 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
1e430 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
1e440 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1e450 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1e460 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
1e470 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
1e480 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
1e490 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
1e4a0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1e4b0 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  c);.}.../*.** Al
1e4c0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
1e4d0 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
1e4e0 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
1e4f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
1e500 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
1e510 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
1e520 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
1e530 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
1e540 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
1e550 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
1e560 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
1e570 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
1e580 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
1e590 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1e5a0 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
1e5b0 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
1e5c0 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
1e5d0 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
1e5e0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
1e5f0 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
1e600 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
1e610 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
1e620 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
1e630 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
1e640 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
1e650 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
1e660 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
1e670 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
1e680 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
1e690 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
1e6a0 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
1e6b0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
1e6c0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
1e6d0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
1e6e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1e6f0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
1e700 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
1e710 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
1e720 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1e730 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
1e740 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
1e750 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
1e760 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
1e770 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
1e780 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
1e790 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
1e7a0 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
1e7b0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
1e7c0 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
1e7d0 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
1e7e0 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
1e7f0 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
1e800 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
1e810 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
1e820 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
1e830 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
1e840 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f  * of the PAGER_O
1e850 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
1e860 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
1e870 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  K flags..**.** T
1e880 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
1e890 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
1e8a0 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
1e8b0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
1e8c0 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
1e8d0 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
1e8e0 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
1e8f0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
1e900 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
1e910 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
1e920 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
1e930 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1e940 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
1e950 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
1e960 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e970 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
1e980 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
1e990 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
1e9a0 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
1e9b0 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
1e9c0 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
1e9d0 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
1e9e0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
1e9f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
1ea00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1ea10 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
1ea20 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
1ea30 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
1ea40 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
1ea50 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
1ea60 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
1ea70 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
1ea80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
1ea90 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
1eaa0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
1eab0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
1eac0 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
1ead0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
1eae0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
1eaf0 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
1eb00 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1eb10 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
1eb20 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1eb30 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
1eb40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eb50 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1eb60 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
1eb70 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
1eb80 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
1eb90 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
1eba0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
1ebb0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
1ebc0 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
1ebd0 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
1ebe0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
1ebf0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
1ec00 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
1ec10 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
1ec20 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
1ec30 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
1ec40 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20  it)(DbPage*) /* 
1ec50 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e  Function to rein
1ec60 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a  itialize pages *
1ec70 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
1ec80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ec90 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
1eca0 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
1ecb0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
1ecc0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
1ecd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1ece0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1ecf0 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
1ed00 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
1ed10 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
1ed20 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
1ed30 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
1ed40 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
1ed50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1ed60 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
1ed70 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
1ed80 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
1ed90 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
1eda0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1edb0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
1edc0 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
1edd0 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
1ede0 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
1edf0 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
1ee00 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
1ee10 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
1ee20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
1ee30 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
1ee40 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
1ee50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
1ee60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ee70 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
1ee80 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
1ee90 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
1eea0 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
1eeb0 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
1eec0 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
1eed0 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65  al */.  int noRe
1eee0 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
1eef0 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
1ef00 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75  OCK)!=0;  /* Tru
1ef10 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c  e to omit read-l
1ef20 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  ock */.  int pca
1ef30 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
1ef40 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
1ef50 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
1ef60 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
1ef70 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a  ache */.  u16 sz
1ef80 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
1ef90 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
1efa0 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
1efb0 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   page size */.. 
1efc0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1efd0 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
1efe0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
1eff0 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
1f000 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
1f010 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
1f020 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
1f030 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
1f040 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
1f050 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
1f060 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
1f070 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
1f080 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
1f090 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
1f0a0 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
1f0b0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
1f0c0 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
1f0d0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
1f0e0 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
1f0f0 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
1f100 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
1f110 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
1f120 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
1f130 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
1f140 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
1f150 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
1f160 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
1f170 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
1f180 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
1f190 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
1f1a0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
1f1b0 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
1f1c0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
1f1d0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
1f1e0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
1f1f0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
1f200 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
1f210 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
1f220 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
1f230 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
1f240 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
1f250 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
1f260 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
1f270 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
1f280 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
1f290 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
1f2a0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
1f2b0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
1f2c0 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
1f2d0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
1f2e0 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
1f2f0 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
1f300 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
1f310 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
1f320 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
1f330 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
1f340 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
1f350 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
1f360 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
1f370 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
1f380 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e  name[0] ){.    n
1f390 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
1f3a0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
1f3b0 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
1f3c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61  qlite3Malloc(nPa
1f3d0 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
1f3e0 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
1f3f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f400 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1f410 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1f420 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
1f430 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1f440 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
1f450 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
1f460 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
1f470 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
1f480 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  = 0;.    }else.#
1f490 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
1f4a0 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
1f4b0 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
1f4c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
1f4d0 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
1f4e0 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
1f4f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f500 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
1f510 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
1f520 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
1f530 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
1f540 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
1f550 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
1f560 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
1f570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f580 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
1f590 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1f5a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1f5b0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
1f5c0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
1f5d0 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
1f5e0 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
1f5f0 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
1f600 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
1f610 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
1f620 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
1f630 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
1f640 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
1f650 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
1f660 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
1f670 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
1f680 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
1f690 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
1f6a0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
1f6b0 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
1f6c0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
1f6d0 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
1f6e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f6f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
1f700 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20  TOPEN;.    }.   
1f710 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1f730 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
1f740 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1f750 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1f760 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
1f770 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
1f780 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
1f790 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
1f7a0 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
1f7b0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
1f7c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f7d0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
1f7e0 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
1f7f0 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
1f800 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
1f810 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
1f820 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
1f830 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
1f840 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
1f850 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
1f860 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
1f870 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
1f880 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1f890 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
1f8a0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
1f8b0 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
1f8c0 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
1f8d0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
1f8e0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
1f8f0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
1f900 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
1f910 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
1f920 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
1f930 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
1f940 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
1f950 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
1f960 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
1f970 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
1f980 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
1f990 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
1f9a0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
1f9b0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
1f9d0 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
1f9e0 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
1f9f0 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
1fa00 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
1fa10 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
1fa20 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
1fa30 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
1fa40 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
1fa50 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
1fa60 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
1fa70 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
1fa80 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
1fa90 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
1faa0 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
1fab0 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
1fac0 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
1fad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
1fae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
1faf0 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
1fb00 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
1fb10 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
1fb20 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
1fb30 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20  ame + 8 + 1     
1fb40 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
1fb50 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61  rnal */.  );.  a
1fb60 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1fb70 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49  E_ALIGNMENT(SQLI
1fb80 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f  TE_INT_TO_PTR(jo
1fb90 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20  urnalFileSize)) 
1fba0 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29  );.  if( !pPtr )
1fbb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1fbc0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
1fbd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fbe0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
1fbf0 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
1fc00 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
1fc10 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
1fc20 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
1fc30 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
1fc40 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
1fc50 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
1fc60 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
1fc70 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
1fc80 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
1fc90 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
1fca0 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
1fcb0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
1fcc0 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
1fcd0 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
1fce0 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
1fcf0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
1fd00 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
1fd10 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
1fd20 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
1fd30 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
1fd40 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
1fd50 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1fd60 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
1fd70 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
1fd80 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
1fd90 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
1fda0 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
1fdb0 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
1fdc0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
1fdd0 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
1fde0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1fdf0 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
1fe00 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
1fe10 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  + 1);.    memcpy
1fe20 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
1fe30 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
1fe40 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
1fe50 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
1fe60 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
1fe70 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
1fe80 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1fe90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
1fea0 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
1feb0 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69 66 28 20  l", 8);.    if( 
1fec0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1fed0 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61 67 65 72  e[0]==0 ) pPager
1fee0 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20  ->zJournal[0] = 
1fef0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
1ff00 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1ff10 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
1ff20 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
1ff30 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
1ff40 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
1ff50 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
1ff60 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1ff70 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1ff80 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
1ff90 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  mDb ){.    int f
1ffa0 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1ffc0 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
1ffd0 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
1ffe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fff0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
20000 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
20010 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
20020 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
20030 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
20040 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
20050 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
20060 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
20070 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
20080 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
20090 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
200a0 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
200b0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
200c0 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
200d0 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
200e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
200f0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
20100 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
20110 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
20120 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
20130 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
20140 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
20150 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
20160 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
20170 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
20180 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
20190 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
201a0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
201b0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
201c0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
201d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
201e0 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
201f0 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
20200 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
20210 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
20220 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
20230 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
20240 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
20250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
20260 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
20270 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
20280 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
20290 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
202a0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
202b0 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
202c0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
202d0 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
202e0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
202f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
20300 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
20310 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61  eDflt = (u16)pPa
20320 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
20330 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20340 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20350 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
20360 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
20370 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
20380 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
20390 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
203a0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
203b0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
203c0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
203d0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
203e0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
203f0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
20400 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
20410 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
20420 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20430 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
20440 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
20450 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
20460 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
20470 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
20480 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
20490 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
204a0 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
204b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
204c0 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
204d0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
204e0 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
204f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20500 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
20510 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
20520 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
20530 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
20540 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
20550 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
20560 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
20570 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
20580 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
20590 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
205a0 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
205b0 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
205c0 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
205d0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
205e0 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
205f0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
20600 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
20610 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
20620 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
20630 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
20640 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
20650 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
20660 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
20670 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
20680 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
20690 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
206a0 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
206b0 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
206c0 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
206d0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
206e0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
206f0 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  E;.    readOnly 
20700 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  = (vfsFlags&SQLI
20710 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
20720 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
20730 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
20740 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
20750 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
20760 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
20770 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
20780 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
20790 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
207a0 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
207b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
207c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
207d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
207e0 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
207f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20800 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
20810 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
20820 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  lt, -1);.    tes
20830 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
20840 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
20850 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20860 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72  curred in either
20870 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
20880 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a  bove, free the .
20890 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63    ** Pager struc
208a0 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
208b0 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
208c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
208d0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
208e0 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
208f0 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ace );.    sqlit
20900 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
20910 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
20920 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
20930 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
20940 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
20950 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
20960 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73  object. */.  ass
20970 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30  ert( nExtra<1000
20980 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52   );.  nExtra = R
20990 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
209a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
209b0 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
209c0 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53     !memDb?pagerS
209f0 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a  tress:0, (void *
20a00 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  )pPager, pPager-
20a10 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41  >pPCache);..  PA
20a20 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
20a30 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
20a40 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
20a50 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
20a60 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
20a70 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
20a80 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
20a90 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
20aa0 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
20ab0 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
20ac0 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
20ad0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  ->noReadlock = (
20ae0 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
20af0 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20  adOnly) ?1:0;.  
20b00 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
20b10 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
20b20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
20b30 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
20b40 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
20b50 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
20b60 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38  bSizeValid = (u8
20b70 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61  )memDb;.  /* pPa
20b80 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
20b90 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20ba0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
20bb0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20bc0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
20bd0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
20be0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
20bf0 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
20c00 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
20c10 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
20c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20c30 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
20c40 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
20c50 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
20c60 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70  NLOCK) );.  /* p
20c70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
20c80 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
20c90 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
20ca0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
20cb0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
20cc0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
20cd0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
20ce0 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
20cf0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
20d00 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
20d10 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
20d20 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
20d30 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
20d40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
20d50 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
20d60 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
20d70 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
20d80 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
20d90 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
20da0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
20db0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
20dc0 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
20dd0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
20de0 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
20df0 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
20e00 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
20e10 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
20e20 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
20e30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
20e40 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
20e50 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
20e60 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
20e70 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
20e80 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
20e90 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
20ea0 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
20eb0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
20ec0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
20ed0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
20ee0 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
20ef0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
20f00 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20   (u16)nExtra;.  
20f10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
20f20 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
20f30 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
20f40 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
20f50 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
20f60 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65  Pager->fd) || te
20f70 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53  mpFile );.  setS
20f80 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
20f90 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75  );.  if( !useJou
20fa0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67  rnal ){.    pPag
20fb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
20fc0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
20fd0 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65  ODE_OFF;.  }else
20fe0 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
20ff0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21000 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
21010 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
21020 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
21030 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
21040 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
21050 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
21060 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  rArg = 0; */.  p
21070 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
21080 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a   = xReinit;.  /*
21090 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
210a0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
210b0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
210c0 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
210d0 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
210e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
210f0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
21100 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21110 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
21120 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
21130 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
21140 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
21150 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
21160 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
21170 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
21180 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
21190 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
211a0 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
211b0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
211c0 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
211d0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
211e0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
211f0 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
21200 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
21210 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
21220 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
21230 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
21240 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
21250 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
21260 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
21270 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
21280 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
21290 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
212a0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
212b0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
212c0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
212d0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
212e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
212f0 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
21300 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
21310 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
21320 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21330 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
21340 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
21350 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
21360 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21370 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
21380 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
21390 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
213a0 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
213b0 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
213c0 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
213d0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
213e0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
213f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
21400 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
21410 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
21420 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
21430 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
21440 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
21450 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
21460 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
21470 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
21480 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
21490 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
214a0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
214b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
214c0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
214d0 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
214e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
214f0 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
21500 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
21510 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
21520 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
21530 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
21540 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
21550 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
21560 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
21570 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
21580 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
21590 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
215a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
215b0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
215c0 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
215d0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
215e0 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
215f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
21600 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
21610 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
21620 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
21630 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
21640 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
21650 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
21660 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
21670 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
21680 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
21690 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
216a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
216b0 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
216c0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
216d0 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
216e0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
216f0 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
21700 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
21710 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
21720 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
21730 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
21740 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
21750 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
21760 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
21770 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
21780 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
21790 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
217a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
217c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
217d0 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20 20   int exists;    
217e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
217f0 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
21800 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
21810 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
21820 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
21830 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21840 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
21850 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
21860 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
21870 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
21880 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
21890 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
218a0 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45  r->state <= PAGE
218b0 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a  R_SHARED );..  *
218c0 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72  pExists = 0;.  r
218d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
218e0 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
218f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
21900 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
21910 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66  , &exists);.  if
21920 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21930 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
21940 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20   int locked;    
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21960 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
21970 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
21980 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
21990 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
219a0 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
219b0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
219c0 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
219d0 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
219e0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
219f0 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
21a00 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
21a10 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
21a20 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
21a30 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
21a40 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
21a50 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
21a60 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
21a70 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
21a80 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
21a90 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
21aa0 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
21ab0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
21ac0 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
21ad0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
21ae0 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
21af0 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
21b00 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
21b10 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
21b20 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
21b30 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
21b40 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
21b50 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
21b60 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
21b70 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
21b80 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
21b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21ba0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
21bb0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
21bc0 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
21bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21be0 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
21bf0 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
21c00 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
21c10 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
21c20 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
21c30 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
21c40 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
21c50 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
21c60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
21c70 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
21c80 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
21c90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
21ca0 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
21cb0 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
21cc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
21cd0 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
21ce0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
21cf0 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
21d00 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
21d10 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
21d20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
21d30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21d40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21d50 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
21d60 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
21d70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21d80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
21d90 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
21da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21db0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
21dc0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
21dd0 66 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  f( sqlite3OsLock
21de0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
21df0 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
21e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
21e20 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
21e30 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
21e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21e50 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
21e60 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
21e70 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
21e80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
21e90 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
21ea0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
21eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21ec0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
21ed0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
21ee0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
21ef0 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
21f00 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
21f10 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
21f20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21f30 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
21f40 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
21f50 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
21f60 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
21f70 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
21f80 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
21f90 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
21fa0 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
21fb0 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
21fc0 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
21fd0 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
21fe0 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
21ff0 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
22000 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
22010 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
22020 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
22030 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
22040 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
22050 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  L;.          rc 
22060 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
22070 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
22080 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
22090 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
220a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
220b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
220c0 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74          u8 first
220d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
220e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
220f0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
22100 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74  , (void *)&first
22110 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
22120 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22130 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
22140 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
22150 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22160 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
22170 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22180 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
22190 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
221a0 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
221b0 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a  s = (first!=0);.
221c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
221d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
221e0 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
221f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
22200 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  cannot open the 
22210 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
22220 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
22230 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20  o see if.       
22240 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20       ** its has 
22250 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
22260 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
22270 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
22280 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
22290 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
222a0 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
222b0 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
222c0 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
222d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
222e0 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
222f0 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
22300 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
22310 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
22320 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
22330 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
22340 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
22350 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
22360 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
22370 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
22380 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
22390 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
223a0 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
223b0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
223c0 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
223d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
223e0 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
223f0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
22400 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
22410 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
22420 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
22430 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22440 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
22450 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22480 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
22490 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
224a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
224b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
224c0 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
224d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
224e0 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
224f0 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
22500 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
22510 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
22520 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22530 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
22540 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
22550 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
22560 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
22570 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
22580 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
22590 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
225a0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
225b0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
225c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
225d0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
225e0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
225f0 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
22600 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
22610 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
22620 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
22630 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
22640 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
22650 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
22660 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
22670 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
22680 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
22690 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
226a0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
226b0 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
226c0 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
226d0 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
226e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22710 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 73  e */.  i64 iOffs
22720 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
22730 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
22740 65 74 20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65  et of file to re
22750 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73  ad from */..  as
22760 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
22770 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
22780 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  D && !MEMDB );. 
22790 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
227a0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
227b0 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f    if( NEVER(!isO
227c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29  pen(pPager->fd))
227d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
227e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
227f0 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   );.    memset(p
22800 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
22810 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
22820 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22830 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66  TE_OK;.  }.  iOf
22840 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
22850 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
22860 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  eSize;.  rc = sq
22870 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
22880 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
22890 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
228a0 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a  Size, iOffset);.
228b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
228c0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
228d0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  D ){.    rc = SQ
228e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
228f0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
22900 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
22910 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
22920 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d  Data)[24];.    m
22930 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
22940 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
22950 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
22960 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
22970 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
22980 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
22990 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
229a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   = SQLITE_NOMEM)
229b0 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
229c0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
229d0 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
229e0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
229f0 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
22a00 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
22a10 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
22a20 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
22a30 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E(("FETCH %d pag
22a40 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
22a50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22a60 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
22a70 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
22a80 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
22a90 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
22aa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22ab0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
22ac0 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
22ad0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
22ae0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
22af0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
22b00 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
22b10 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74  gerAcquire() unt
22b20 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
22b30 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
22b40 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
22b50 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
22b60 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
22b70 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
22b80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
22b90 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
22ba0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
22bb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
22bc0 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
22bd0 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
22be0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
22bf0 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
22c00 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
22c10 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  y in PAGER_UNLOC
22c20 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  K state (no lock
22c30 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
22c40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22c50 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
22c60 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
22c70 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
22c80 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
22c90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22ca0 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
22cb0 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
22cc0 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
22cd0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
22ce0 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
22cf0 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
22d00 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
22d10 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
22d20 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
22d30 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
22d40 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
22d50 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
22d60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22d70 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
22d80 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
22d90 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
22da0 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
22db0 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
22dc0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
22dd0 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
22de0 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
22df0 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
22e00 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
22e10 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
22e20 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
22e30 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
22e40 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
22e50 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
22e60 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
22e70 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
22e80 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
22e90 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
22ea0 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
22eb0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
22ec0 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
22ed0 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
22ee0 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
22ef0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22f00 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
22f10 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
22f20 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
22f30 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
22f40 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  ** If the operat
22f50 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
22f60 20 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f   (2) above is no
22f70 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64  t attempted, and
22f80 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72   if the.** pager
22f90 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   is in an error 
22fa0 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
22fb0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65   SQLITE_FULL whe
22fc0 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
22fd0 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73  ,.** the error s
22fe0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
22ff0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20  is returned. It 
23000 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20  is permitted to 
23010 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61  read the.** data
23020 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c  base when in SQL
23030 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73  ITE_FULL error s
23040 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  tate..**.** Othe
23050 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
23060 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
23070 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
23080 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
23090 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63  .** IO error occ
230a0 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
230b0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
230c0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
230d0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
230e0 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  le or rolling ba
230f0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
23100 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  e, the IO error 
23110 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
23120 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23130 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
23140 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23150 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23160 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
23170 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23180 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ode */.  int isE
23190 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20  rrorReset = 0;  
231a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
231b0 72 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e  rue if recoverin
231c0 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61  g from error sta
231d0 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  te */..  /* This
231e0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
231f0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74   called from b-t
23200 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65  ree and only whe
23210 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  n there are no. 
23220 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
23230 70 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  pages */.  asser
23240 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
23250 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
23260 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
23270 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
23280 74 61 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20  tabase is in an 
23290 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
232a0 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
232b0 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
232c0 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
232d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
232e0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
232f0 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  d rollback.  ** 
23300 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  any hot journal 
23310 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
23320 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  em..  */.  if( !
23330 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
23340 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
23350 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
23360 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
23370 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  r->zJournal ){. 
23380 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73 65       isErrorRese
23390 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
233a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
233b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
233c0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
233d0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
233e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
233f0 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72   still in an err
23400 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
23410 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72   proceed. The er
23420 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20  ror .  ** state 
23430 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
23440 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
23450 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65 6e   the future when
23460 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20   all page .  ** 
23470 72 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 64  references are d
23480 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20 63  ropped and the c
23490 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
234a0 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  arded..  */.  if
234b0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
234c0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
234d0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
234e0 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
234f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
23500 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
23510 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
23520 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72  _UNLOCK || isErr
23530 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73  orReset ){.    s
23540 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
23550 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
23560 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
23570 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30  isHotJournal = 0
23580 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
23590 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
235a0 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
235b0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
235c0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
235d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
235e0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
235f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
23600 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
23610 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
23620 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
23630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23640 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23650 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
23660 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
23670 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
23680 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
23690 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
236a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
236b0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
236c0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
236d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
236e0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
236f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
23700 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
23710 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
23720 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
23730 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
23740 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
23750 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
23760 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
23770 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
23780 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
23790 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
237a0 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
237b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
237c0 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
237d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
237e0 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41  ger->state <= PA
237f0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
23800 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
23810 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
23820 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  isHotJournal);. 
23830 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23850 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23870 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73 65   if( isErrorRese
23880 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61  t || isHotJourna
23890 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
238a0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
238b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
238c0 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
238d0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
238e0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
238f0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
23900 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
23910 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
23920 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
23930 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
23940 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
23950 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
23960 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
23970 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
23980 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
23990 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
239a0 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
239b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
239c0 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
239d0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
239e0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
239f0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
23a00 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
23a10 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
23a20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
23a30 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
23a40 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
23a50 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
23a60 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
23a70 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
23a80 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
23a90 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
23aa0 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
23ab0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
23ac0 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
23ad0 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
23ae0 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
23af0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
23b00 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
23b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
23b20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
23b30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
23b40 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
23b50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
23b60 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
23b70 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
23b80 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
23b90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23ba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23bb0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
23bc0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
23bd0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
23be0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
23bf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23c00 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
23c10 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 7d  CLUSIVE;.      }
23c20 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  . .      /* Open
23c30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
23c40 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
23c50 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
23c60 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  use in .      **
23c70 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
23c80 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
23c90 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
23ca0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  be kept open and
23cb0 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  .      ** possib
23cc0 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
23cd0 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
23ce0 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  on. On some syst
23cf0 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ems, the.      *
23d00 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63  * OsTruncate() c
23d10 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c  all used in excl
23d20 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
23d30 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a  e also requires.
23d40 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
23d50 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
23d60 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
23d70 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
23d80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
23d90 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
23da0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23db0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
23dc0 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  ,pPager->zJourna
23dd0 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  l,SQLITE_ACCESS_
23de0 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20  EXISTS,&res);.  
23df0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23e10 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
23e20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
23e30 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
23e40 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
23e50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
23e60 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
23e70 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
23e80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23e90 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
23ea0 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
23eb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23ec0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
23ed0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
23ee0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
23ef0 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
23f00 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
23f10 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
23f20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
23f30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23f40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23f50 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
23f60 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
23f80 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
23f90 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EN;.            
23fa0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
23fb0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
23fc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23fd0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
23ff0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
24000 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
24010 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
24020 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 20 20  t some .        
24030 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
24040 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20  nection managed 
24050 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f  to get in and ro
24060 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72  ll it back befor
24070 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
24080 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
24090 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
240a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
240b0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
240c0 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20           ** may 
240d0 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
240e0 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
240f0 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
24100 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
24110 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73   ** function was
24120 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20   called and the 
24130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
24140 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 2a 2f  s not exist.  */
24150 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
24160 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
24170 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
24180 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
24190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
241a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
241b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
241c0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
241d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
241e0 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20 61 72   /* TODO: Why ar
241f0 65 20 74 68 65 73 65 20 63 6c 65 61 72 65 64 20  e these cleared 
24200 68 65 72 65 3f 20 49 73 20 69 74 20 6e 65 63 65  here? Is it nece
24210 73 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20 20 20  ssary? */.      
24220 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
24230 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
24240 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
24250 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
24260 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
24270 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
24280 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
24290 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20  = 0;. .      /* 
242a0 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
242b0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
242c0 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
242d0 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
242e0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
242f0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
24300 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
24310 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
24320 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
24330 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
24340 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
24350 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
24360 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
24370 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 0a 20  sistent cache.. 
24380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
24390 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
243a0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
243b0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
243c0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
243d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
243e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
243f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
24400 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
24410 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
24420 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
24430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24440 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
24450 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
24460 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
24470 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
24480 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
24490 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
244a0 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  >PAGER_SHARED). 
244b0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
244c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
244d0 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65  Backup || sqlite
244e0 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
244f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24500 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>0 ){.      /* 
24510 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
24520 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
24530 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61  quired on the da
24540 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20  tabase file.    
24550 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
24560 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73  re already pages
24570 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66   in the cache (f
24580 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20  rom a previous. 
24590 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
245a0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
245b0 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
245c0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
245d0 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62  e.      ** has b
245e0 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
245f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
24600 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
24610 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  h the.      ** c
24620 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ache..      **. 
24630 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
24640 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65   changes is dete
24650 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
24660 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
24670 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
24680 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
24690 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
246a0 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
246b0 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
246c0 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
246d0 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
246e0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
246f0 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
24700 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
24710 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
24720 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
24730 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
24740 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
24750 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
24760 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
24770 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
24780 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
24790 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
247a0 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
247b0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
247c0 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
247d0 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
247e0 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
247f0 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
24800 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
24810 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
24820 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
24830 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
24840 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
24850 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
24860 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
24870 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20  Pager, 0);..    
24880 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
24890 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
248a0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
248b0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 67  rCode;.        g
248c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
248d0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
248e0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
248f0 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  eValid );.      
24900 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
24910 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
24920 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
24930 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
24940 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
24950 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
24960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
24970 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
24980 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
24990 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
249a0 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66   24);.        if
249b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
249c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
249d0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
249e0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
249f0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
24a00 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
24a10 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
24a20 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ));.      }..   
24a30 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
24a40 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
24a50 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
24a60 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
24a70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24a80 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
24a90 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
24aa0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
24ab0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
24ac0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
24ad0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
24ae0 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  RED );.  }.. fai
24af0 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
24b00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24b10 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  /* pager_unlock(
24b20 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  ) is a no-op for
24b30 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
24b40 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  and in-memory da
24b50 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20  tabases. */.    
24b60 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
24b70 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
24b80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24b90 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
24ba0 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
24bb0 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
24bc0 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
24bd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
24be0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
24bf0 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
24c00 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
24c10 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
24c20 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
24c30 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
24c40 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
24c50 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
24c60 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
24c70 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
24c80 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
24c90 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
24ca0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
24cb0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
24cc0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
24cd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24ce0 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63    if( (sqlite3Pc
24cf0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
24d00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
24d10 29 0a 20 20 20 26 26 20 28 21 70 50 61 67 65 72  ).   && (!pPager
24d20 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
24d30 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
24d40 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20  alOff>0) .  ){. 
24d50 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
24d60 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
24d70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
24d80 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
24d90 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
24da0 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
24db0 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
24dc0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
24dd0 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
24de0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
24df0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
24e00 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
24e10 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
24e20 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
24e30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24e40 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
24e50 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
24e60 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
24e70 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
24e80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
24e90 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
24ea0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
24eb0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
24ec0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
24ed0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
24ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24ef0 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
24f00 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
24f10 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
24f20 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
24f30 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
24f40 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
24f50 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
24f60 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
24f70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
24f80 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
24f90 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
24fa0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
24fb0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
24fc0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
24fd0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
24fe0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
24ff0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
25000 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
25010 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
25020 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
25030 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
25040 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
25050 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
25060 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
25070 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
25080 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
25090 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
250a0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
250b0 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
250c0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
250d0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
250e0 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
250f0 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
25100 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
25110 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
25120 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
25130 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
25140 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
25150 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
25160 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
25170 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
25180 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
25190 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
251a0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
251b0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
251c0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
251d0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
251e0 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
251f0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
25200 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
25210 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
25220 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
25230 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65  curs in two sepe
25240 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a  rate scenarios:.
25250 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
25260 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
25270 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
25280 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
25290 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
252a0 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
252b0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
252c0 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
252d0 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
252e0 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
252f0 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 70  o the cache to p
25300 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74 68 65  opulate with the
25310 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
25320 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
25330 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
25340 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
25350 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
25360 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
25370 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
25380 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
25390 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
253a0 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
253b0 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
253c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
253d0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
253e0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
253f0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
25400 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
25410 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
25420 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
25430 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
25440 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
25450 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
25460 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
25470 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
25480 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
25490 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
254a0 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
254b0 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
254c0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
254d0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
254e0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
254f0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
25500 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
25510 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
25520 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
25530 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
25540 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
25550 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
25560 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
25570 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
25580 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
25590 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
255a0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
255b0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
255c0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
255d0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
255e0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
255f0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
25600 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
25610 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
25620 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
25630 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
25640 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
25650 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
25660 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
25670 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
25680 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
25690 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
256a0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
256b0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
256c0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
256d0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
256e0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
256f0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
25700 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
25710 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
25720 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
25730 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
25740 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
25750 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
25760 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
25770 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25780 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
25790 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
257a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
257b0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
257c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
257d0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
257e0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
257f0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
25800 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
25810 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
25820 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
25830 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
25840 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
25850 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
25860 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
25870 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
25880 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
25890 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
258a0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
258b0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
258c0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
258d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
258e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
258f0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
25900 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
25910 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25920 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
25930 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
25940 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
25950 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
25960 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
25970 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
25980 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
25990 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
259a0 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
259b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
259c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
259d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
259e0 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
259f0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
25a00 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
25a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25a20 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
25a30 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
25a40 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20  o, 1, ppPage);. 
25a50 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
25a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
25a70 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
25a80 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
25a90 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
25aa0 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
25ab0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
25ac0 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
25ad0 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
25ae0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
25af0 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
25b00 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
25b10 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
25b20 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
25b30 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
25b40 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
25b50 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25b60 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25b70 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
25b80 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
25b90 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  t( (*ppPage)->pP
25ba0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
25bb0 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
25bc0 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  r==0 );..  if( (
25bd0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
25be0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
25bf0 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
25c00 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
25c10 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
25c20 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
25c30 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
25c40 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
25c50 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
25c60 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
25c70 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
25c80 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
25c90 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
25ca0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
25cb0 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
25cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25cd0 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
25ce0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
25cf0 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
25d00 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
25d10 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
25d20 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
25d30 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 20  ialized.  */.   
25d40 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20 20 20   int nMax;..    
25d50 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
25d60 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70  r->nMiss);.    p
25d70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  Pg = *ppPage;.  
25d80 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
25d90 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
25da0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
25db0 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
25dc0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
25dd0 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
25de0 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
25df0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
25e00 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
25e10 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
25e20 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
25e30 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
25e40 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
25e50 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
25e60 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
25e70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
25e80 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
25e90 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
25ea0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
25eb0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
25ec0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
25ed0 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
25ee0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25f00 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
25f10 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
25f20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
25f30 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
25f40 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  | noContent ){. 
25f50 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
25f60 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
25f70 09 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c  .rc = SQLITE_FUL
25f80 4c 3b 0a 09 67 6f 74 6f 20 70 61 67 65 72 5f 61  L;..goto pager_a
25f90 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
25fa0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
25fb0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
25fc0 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
25fd0 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
25fe0 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
25ff0 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
26000 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
26010 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
26020 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
26030 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
26040 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
26050 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
26060 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
26070 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
26080 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
26090 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
260a0 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
260b0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
260c0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
260d0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
260e0 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
260f0 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
26100 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
26110 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
26120 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
26130 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
26140 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
26150 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
26160 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
26170 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
26180 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
26190 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
261a0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
261b0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
261c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
261d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
261e0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
261f0 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
26200 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
26210 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
26220 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
26230 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
26240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
26250 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
26260 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26270 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
26280 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
26290 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
262a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
262b0 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
262c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
262d0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
262e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
262f0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
26300 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
26310 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
26320 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
26330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26340 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
26350 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
26360 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
26370 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
26380 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
26390 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
263a0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
263b0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
263c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
263d0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
263e0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
263f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
26400 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
26410 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
26420 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
26430 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
26440 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
26450 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
26460 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
26470 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
26480 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
26490 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
264a0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
264b0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
264c0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
264d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
264e0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
264f0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
26500 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41   not in cache. A
26510 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66  lso, return 0 if
26520 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69   the .** pager i
26530 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  s in PAGER_UNLOC
26540 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
26550 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26560 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  lled,.** or if t
26570 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
26580 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
26590 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
265a0 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  FULL..**.** See 
265b0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
265c0 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
265d0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
265e0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
265f0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
26600 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
26610 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
26620 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
26630 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
26640 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
26650 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
26660 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
26670 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
26680 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
26690 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
266a0 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
266b0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
266c0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
266d0 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
266e0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
266f0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
26700 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
26710 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
26720 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
26730 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
26740 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26750 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
26760 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26770 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50  Pager->state > P
26780 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
26790 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
267a0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
267b0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
267c0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
267d0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
267e0 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
267f0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
26800 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
26810 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
26820 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
26830 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
26840 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
26850 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
26860 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
26870 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
26880 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
26890 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
268a0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
268b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
268c0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
268d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
268e0 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
268f0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
26900 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
26910 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
26920 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
26930 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
26940 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
26950 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
26960 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
26970 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   If the main jou
26980 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c  rnal file has al
26990 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
269a0 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  d, ensure that t
269b0 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  he.** sub-journa
269c0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74  l file is open t
269d0 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  oo. If the main 
269e0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f  journal is not o
269f0 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  pen,.** this fun
26a00 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26a10 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
26a20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
26a30 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
26a40 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
26a50 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54  an. .** An SQLIT
26a60 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
26a70 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
26a80 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
26a90 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  .** sqlite3OsOpe
26aa0 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  n() fails..*/.st
26ab0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
26ac0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
26ad0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26ae0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26af0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
26b00 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
26b10 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
26b20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
26b30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
26b40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
26b50 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
26b60 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
26b70 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
26b80 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
26b90 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
26ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26bb0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
26bc0 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
26bd0 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45  er->sjfd, SQLITE
26be0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
26bf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
26c00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26c10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26c20 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
26c30 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
26c40 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
26c50 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
26c60 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
26c70 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
26c80 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
26c90 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
26ca0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
26cb0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
26cc0 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
26cd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
26ce0 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
26cf0 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
26d00 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
26d10 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
26d20 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
26d30 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
26d40 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
26d50 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
26d60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26d70 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
26d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26d90 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
26da0 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
26db0 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
26dc0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
26dd0 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
26de0 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
26df0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
26e00 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
26e10 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
26e20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26e30 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
26e40 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
26e50 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
26e60 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
26e70 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
26e80 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
26e90 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
26ea0 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
26eb0 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
26ec0 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
26ed0 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
26ee0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
26ef0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
26f00 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
26f10 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
26f20 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
26f30 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
26f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
26f50 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
26f60 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
26f70 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
26f80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
26f90 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
26fa0 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
26fb0 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
26fc0 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
26fd0 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
26fe0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
26ff0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27000 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
27010 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
27020 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
27030 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
27050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27060 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
27070 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
27080 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
27090 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
270a0 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
270b0 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
270c0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
270d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
270e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
270f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27100 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
27110 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27120 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
27130 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
27140 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72  E_OFF );.  asser
27150 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
27160 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
27170 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
27180 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
27190 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
271a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
271b0 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
271c0 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
271d0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
271e0 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
271f0 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
27200 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
27210 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
27220 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
27230 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
27240 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
27250 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61   TODO: Is it rea
27260 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
27270 67 65 74 20 68 65 72 65 20 77 69 74 68 20 64 62  get here with db
27280 53 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66  SizeValid==0? If
27290 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63   not,.  ** the c
272a0 61 6c 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65  all to PagerPage
272b0 63 6f 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72  count() can be r
272c0 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74  emoved..  */.  t
272d0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
272e0 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
272f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
27300 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
27310 72 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72  r, 0);..  pPager
27320 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
27330 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
27340 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
27350 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
27360 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
27370 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27380 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
27390 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a  .  /* Open the j
273a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
273b0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
273c0 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20   open. */.  if( 
273d0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
273e0 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
273f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
27400 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
27410 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
27420 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
27430 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
27440 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
27450 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
27460 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
27470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27480 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
27490 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
274a0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  e */.        SQL
274b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
274c0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
274d0 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28  REATE|.        (
274e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
274f0 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53   ? .          (S
27500 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
27510 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
27520 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
27530 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53  L):.          (S
27540 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
27550 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
27560 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
27570 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
27580 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d  WRITE.      rc =
27590 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
275a0 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  pen(.          p
275b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
275c0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
275d0 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
275e0 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
275f0 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65  ).      );.#else
27600 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27610 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
27620 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
27630 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
27640 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  lags, 0);.#endif
27650 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
27660 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
27670 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
27680 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a  r->jfd) );.  }..
27690 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
276a0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
276b0 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
276c0 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
276d0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  n .  ** the sub-
276e0 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
276f0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
27700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27710 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43  {.    /* TODO: C
27720 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
27730 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
27740 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
27750 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
27760 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
27770 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72  Size;.    pPager
27780 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
27790 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
277a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
277b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
277c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
277d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
277e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
277f0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
27800 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27810 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Hdr = 0;.    rc 
27820 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
27830 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
27840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27850 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  OK && pPager->nS
27860 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
27870 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
27880 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
27890 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
278a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
278b0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
278c0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
278d0 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
278e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
278f0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
27900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
27910 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
27920 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
27930 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
27940 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
27950 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
27960 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
27970 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
27980 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
27990 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
279a0 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
279b0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
279c0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
279d0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
279e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
279f0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
27a00 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
27a10 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
27a20 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
27a30 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
27a40 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
27a50 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
27a60 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
27a70 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
27a80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
27a90 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
27aa0 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  ry or in-memory 
27ab0 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f  file and, the jo
27ac0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a  urnal file is .*
27ad0 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68  * opened if it h
27ae0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65  as not been alre
27af0 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f  ady. For a tempo
27b00 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f  rary file, the o
27b10 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68  pening .** of th
27b20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27b30 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
27b40 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74   there is an act
27b50 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20  ual need to .** 
27b60 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
27b70 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20  rnal. TODO: Why 
27b80 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79  handle temporary
27b90 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74   files different
27ba0 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ly?.**.** If the
27bb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27bc0 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69   opened (or if i
27bd0 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
27be0 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f  n), then a.** jo
27bf0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
27c00 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
27c10 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a  tart of it..**.*
27c20 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
27c30 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
27c40 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
27c50 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
27c60 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
27c70 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
27c80 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
27c90 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
27ca0 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
27cb0 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
27cc0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27cd0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
27ce0 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
27cf0 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
27d00 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
27d10 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
27d20 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
27d30 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
27d40 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
27d50 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
27d60 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
27d70 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
27d80 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
27d90 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
27da0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
27db0 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
27dc0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
27dd0 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
27de0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
27df0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
27e00 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
27e10 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
27e20 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
27e30 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
27e40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27e50 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
27e60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
27e70 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
27e80 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
27e90 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
27ea0 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28  jInMemory;.  if(
27eb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
27ec0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
27ed0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
27ee0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
27ef0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27f00 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67   !MEMDB && !pPag
27f10 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
27f20 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  .    /* Obtain a
27f30 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
27f40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
27f50 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
27f60 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
27f70 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
27f80 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
27f90 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
27fa0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
27fb0 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79   The.    ** busy
27fc0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
27fd0 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
27fe0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
27ff0 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
28000 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e    ** lock, but n
28010 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e  ot when obtainin
28020 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  g the RESERVED l
28030 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
28040 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
28050 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
28060 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
28070 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
28090 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
280a0 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
280b0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
280c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
280d0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
280e0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
280f0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
28100 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
28110 20 49 66 20 74 68 65 20 72 65 71 75 69 72 65 64   If the required
28120 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63 63   locks were succ
28130 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
28140 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  d, open the jour
28150 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
28160 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 66 69  and write the fi
28170 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
28180 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  er to it..    */
28190 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
281a0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
281b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
281c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
281d0 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63  _OFF ){.      rc
281e0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
281f0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
28200 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
28210 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28220 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
28230 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
28240 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
28250 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
28260 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
28270 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
28280 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
28290 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
282a0 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
282b0 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
282c0 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
282d0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
282e0 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
282f0 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
28300 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
28310 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
28320 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
28330 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
28340 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
28350 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
28360 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
28370 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
28380 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28390 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
283a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
283b0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
283c0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
283d0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
283e0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
283f0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
28400 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
28410 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
28420 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
28430 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
28440 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
28450 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
28460 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
28470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28480 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
28490 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 21  _OK );.  if( rc!
284a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
284b0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
284c0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b  r->dbModified );
284d0 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61  .    /* Ignore a
284e0 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74  ny IO error that
284f0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 70   occurs within p
28500 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
28510 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20  tion(). The.    
28520 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  ** purpose of th
28530 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65  is call is to re
28540 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
28550 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
28560 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73  ger.    ** sub-s
28570 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27  ystem. It doesn'
28580 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20  t matter if the 
28590 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
285a0 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20  not properly.   
285b0 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74   ** finalized at
285c0 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e   this point (sin
285d0 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76  ce it is not a v
285e0 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
285f0 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a  e anyway)..    *
28600 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f  /.    pager_end_
28610 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
28620 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  er, 0);.  }.  re
28630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28640 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
28650 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
28660 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
28670 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
28680 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
28690 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
286a0 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
286b0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
286c0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
286d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
286e0 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
286f0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
28700 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
28710 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
28720 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
28730 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
28740 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
28750 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
28760 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
28770 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
28780 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
28790 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
287a0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
287b0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
287c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
287d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
287e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
287f0 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  OK;..  /* If an 
28800 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
28810 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
28820 65 64 2c 20 77 65 20 73 68 6f 75 6c 64 20 6e 6f  ed, we should no
28830 74 20 62 65 0a 20 20 2a 2a 20 63 61 6c 6c 69 6e  t be.  ** callin
28840 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
28850 20 52 65 70 65 61 74 20 74 68 65 20 65 72 72 6f   Repeat the erro
28860 72 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  r for robustness
28870 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
28880 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
28890 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
288a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
288b0 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
288c0 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
288d0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
288e0 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
288f0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
28900 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
28910 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
28920 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
28930 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
28940 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
28950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
28960 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ERM;..  assert( 
28970 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
28980 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
28990 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
289a0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
289b0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
289c0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
289d0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
289e0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
289f0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
28a00 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
28a10 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
28a20 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
28a30 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
28a40 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
28a50 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
28a60 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70  ge(pPg) ){.    p
28a70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
28a80 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
28a90 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
28aa0 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
28ab0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
28ac0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
28ad0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
28ae0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
28af0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
28b00 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
28b10 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
28b20 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
28b30 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
28b40 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
28b50 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
28b60 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
28b70 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
28b80 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
28b90 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28ba0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
28bb0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
28bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
28bd0 61 67 65 72 42 65 67 69 6e 28 70 50 61 67 65 72  agerBegin(pPager
28be0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75 62  , 0, pPager->sub
28bf0 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20  jInMemory);.    
28c00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28c10 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
28c20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28c30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28c40 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
28c50 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
28c60 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
28c70 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
28c80 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
28c90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
28ca0 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61 73 73  OFF ){.      ass
28cb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
28cc0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
28cd0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
28ce0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
28cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
28d00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28d10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28d20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
28d30 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  ied = 1;.  .    
28d40 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
28d50 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
28d60 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
28d70 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
28d80 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
28d90 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
28da0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
28db0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
28dc0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
28dd0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
28de0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
28df0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
28e00 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
28e10 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
28e20 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
28e30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28e40 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
28e50 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
28e60 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
28e70 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
28e80 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
28e90 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
28ea0 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
28eb0 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
28ec0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28ed0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
28ee0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
28ef0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
28f00 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
28f10 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
28f20 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
28f30 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
28f40 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
28f50 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
28f60 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
28f70 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
28f80 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
28f90 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
28fa0 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
28fb0 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29  E_NOMEM, pData2)
28fc0 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
28fd0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
28fe0 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
28ff0 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  2);.        rc =
29000 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
29010 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
29020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
29030 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
29040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
29070 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
29080 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
29090 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
290c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
290d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
290e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
290f0 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
29100 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d  ize+4;.        }
29110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
29120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29130 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
29140 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
29150 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
29160 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
29170 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
29180 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
29190 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
291a0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
291b0 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
291c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
291d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
291f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
29200 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29210 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
29220 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
29230 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
29240 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
29250 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
29260 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
29270 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
29280 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
29290 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
292a0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
292b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
292c0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
292d0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
292e0 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
292f0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
29300 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
29310 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
29320 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
29330 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
29340 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
29350 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
29360 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
29370 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
29380 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
29390 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
293a0 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
293b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
293c0 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
293d0 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
293e0 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
293f0 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
29400 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
29410 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
29420 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
29430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29440 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
29450 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
29460 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
29470 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
29480 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
29490 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
294a0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
294b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
294c0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
294d0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
294e0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
294f0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
29500 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
29510 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
29520 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
29530 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
29540 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
29550 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
29560 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
29570 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
29580 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
29590 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
295a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
295b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
295c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
295d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
295e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
295f0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
29600 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
29610 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
29620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29630 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
29640 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
29650 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
29660 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
29670 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
29680 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
296a0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
296b0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
296c0 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
296d0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
296e0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
296f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
29720 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
29730 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
29740 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
29750 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29760 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
29770 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
29780 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
29790 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
297a0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
297b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
297c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
297d0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
297e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
297f0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29800 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
29810 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
29820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29830 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
29840 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
29860 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
29870 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
29880 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29890 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
298a0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
298b0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
298c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
298d0 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
298e0 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
298f0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
29900 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
29910 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
29920 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
29930 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
29940 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
29950 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
29960 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
29970 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
29980 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
29990 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
299a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
299b0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
299c0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
299d0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
299e0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
299f0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
29a00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
29a10 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
29a20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
29a30 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
29a40 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
29a50 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
29a60 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
29a70 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
29a80 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
29a90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
29ab0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
29ac0 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
29ad0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
29ae0 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
29af0 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
29b00 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
29b10 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
29b20 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
29b30 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
29b40 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
29b50 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
29b60 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
29b70 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
29b80 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29b90 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
29ba0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
29bb0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
29bc0 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
29bd0 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
29be0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
29bf0 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
29c00 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
29c10 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
29c20 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
29c30 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
29c40 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
29c50 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
29c60 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
29c70 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
29c80 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
29c90 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
29ca0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
29cb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
29cc0 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
29cd0 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
29ce0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29cf0 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
29d00 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
29d10 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
29d20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
29d30 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
29d40 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
29d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
29d60 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
29d70 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
29d80 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
29d90 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
29da0 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
29db0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
29dc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29dd0 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
29de0 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
29df0 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
29e00 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
29e10 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
29e20 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
29e30 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
29e40 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
29e50 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
29e60 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
29e70 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
29e80 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
29e90 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
29ea0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29eb0 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
29ec0 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
29ed0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
29ee0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
29ef0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
29f00 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
29f10 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
29f20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
29f30 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
29f40 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
29f50 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
29f60 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
29f70 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
29f80 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
29f90 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
29fa0 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
29fb0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
29fc0 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
29fd0 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
29fe0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
29ff0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
2a000 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
2a010 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
2a020 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
2a030 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
2a040 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
2a050 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
2a060 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
2a070 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
2a080 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
2a090 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
2a0a0 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
2a0b0 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
2a0c0 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
2a0d0 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
2a0e0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
2a0f0 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
2a100 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
2a110 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
2a120 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
2a130 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
2a140 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71  1)) + 1;..    sq
2a150 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
2a160 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
2a170 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
2a180 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
2a190 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
2a1a0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
2a1b0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
2a1c0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
2a1d0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
2a1e0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
2a1f0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
2a200 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
2a210 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
2a220 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
2a230 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
2a240 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2a250 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
2a260 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
2a270 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
2a280 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
2a290 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
2a2a0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
2a2b0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
2a2c0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
2a2d0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
2a2e0 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
2a2f0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
2a300 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
2a310 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
2a320 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
2a330 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
2a340 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
2a350 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2a360 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
2a370 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a380 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2a390 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
2a3a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2a3b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a3c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2a3d0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
2a3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a3f0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
2a400 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
2a410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
2a420 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2a430 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
2a440 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
2a450 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nc);.           
2a460 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
2a470 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2a480 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2a490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a4a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2a4b0 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
2a4c0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
2a4d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2a4e0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
2a4f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2a500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
2a510 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2a520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2a530 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2a540 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
2a550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2a560 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
2a570 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
2a580 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
2a590 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
2a5a0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
2a5b0 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
2a5c0 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
2a5d0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
2a5e0 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
2a5f0 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
2a600 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
2a610 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
2a620 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
2a630 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2a640 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
2a650 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
2a660 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
2a670 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
2a680 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
2a690 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
2a6a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2a6b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2a6c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2a6d0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
2a6e0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2a6f0 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
2a700 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  c==0 );.      fo
2a710 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
2a720 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
2a730 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
2a740 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
2a750 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
2a760 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
2a770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
2a780 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
2a790 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
2a7a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2a7b0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
2a7c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a7d0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2a7e0 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
2a7f0 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
2a800 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2a810 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
2a820 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
2a830 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
2a840 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
2a850 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
2a860 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a870 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2a880 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
2a890 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
2a8a0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
2a8b0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
2a8c0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2a8d0 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
2a8e0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
2a8f0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
2a900 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
2a910 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2a920 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
2a930 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
2a940 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a950 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
2a960 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
2a970 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2a980 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
2a990 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
2a9a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
2a9b0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
2a9c0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
2a9d0 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
2a9e0 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
2a9f0 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
2aa00 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
2aa10 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
2aa20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
2aa30 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2aa40 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
2aa50 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
2aa60 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
2aa70 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
2aa80 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
2aa90 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
2aaa0 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
2aab0 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
2aac0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
2aad0 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
2aae0 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
2aaf0 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
2ab00 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
2ab10 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
2ab20 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
2ab30 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
2ab40 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
2ab50 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
2ab60 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
2ab70 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
2ab80 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
2ab90 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
2aba0 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
2abb0 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
2abc0 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
2abd0 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
2abe0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2abf0 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
2ac00 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2ac10 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2ac20 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
2ac30 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2ac40 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
2ac50 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
2ac60 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2ac70 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
2ac80 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
2ac90 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
2aca0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
2acb0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
2acc0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2acd0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
2ace0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
2acf0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
2ad00 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
2ad10 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
2ad20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
2ad30 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2ad40 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
2ad50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2ad60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2ad70 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
2ad80 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
2ad90 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a  atabase file .**
2ada0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
2adb0 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62   stored as a 4-b
2adc0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2add0 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20  nteger starting 
2ade0 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73  at .** byte offs
2adf0 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  et 24 of the pag
2ae00 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  er file..**.** I
2ae10 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  f the isDirectMo
2ae20 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  de flag is zero,
2ae30 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
2ae40 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
2ae50 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
2ae60 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
2ae70 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
2ae80 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2ae90 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
2aea0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2aeb0 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
2aec0 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
2aed0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
2aee0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
2aef0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
2af00 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
2af10 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f  g may only be no
2af20 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69  n-zero if the li
2af30 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
2af40 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53  ed.** with the S
2af50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2af60 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20  MIC_WRITE macro 
2af70 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73  defined. In this
2af80 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44   case,.** if isD
2af90 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  irect is non-zer
2afa0 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  o, then the data
2afb0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64  base file is upd
2afc0 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ated directly.**
2afd0 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75   by writing an u
2afe0 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  pdated version o
2aff0 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61  f page 1 using a
2b000 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a   call to the .**
2b010 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2b020 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ) function..*/.s
2b030 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2b040 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2b050 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
2b060 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f  , int isDirectMo
2b070 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  de){.  int rc = 
2b080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
2b090 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69   Declare and ini
2b0a0 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74  tialize constant
2b0b0 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65   integer 'isDire
2b0c0 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  ct'. If the.  **
2b0d0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2b0e0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
2b0f0 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
2b100 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65  ild, then isDire
2b110 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69  ct.  ** is initi
2b120 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
2b130 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
2b140 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70  e isDirectMode p
2b150 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f  arameter.  ** to
2b160 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
2b170 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
2b180 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
2b190 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ero..  **.  ** T
2b1a0 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2b1b0 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  if the atomic-wr
2b1c0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2b1d0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61   is not.  ** ena
2b1e0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2b1f0 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c  time, the compil
2b200 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20  er can omit the 
2b210 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69  tests of.  ** 'i
2b220 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20  sDirect' below, 
2b230 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2b240 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e  lock enclosed in
2b250 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69   the.  ** "if( i
2b260 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69  sDirect )" condi
2b270 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tion..  */.#ifnd
2b280 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2b290 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20  _ATOMIC_WRITE.# 
2b2a0 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
2b2b0 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69  DE 0.  assert( i
2b2c0 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29  sDirectMode==0 )
2b2d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2b2e0 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64  ETER(isDirectMod
2b2f0 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  e);.#else.# defi
2b300 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69  ne DIRECT_MODE i
2b310 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64  sDirectMode.#end
2b320 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
2b330 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2b340 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2b350 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
2b360 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
2b370 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
2b380 64 62 53 69 7a 65 3e 30 29 20 29 7b 0a 20 20 20  dbSize>0) ){.   
2b390 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20   PgHdr *pPgHdr; 
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3b0 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70  * Reference to p
2b3c0 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32  age 1 */.    u32
2b3d0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
2b3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2b3f0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63  itial value of c
2b400 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
2b410 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  eld */..    asse
2b420 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
2b430 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28  pFile && isOpen(
2b440 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
2b450 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
2b460 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
2b470 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
2b480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b490 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2b4a0 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
2b4b0 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d   assert( pPgHdr=
2b4c0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
2b4d0 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  _OK );..    /* I
2b4e0 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66  f page one was f
2b4f0 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75  etched successfu
2b500 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75  lly, and this fu
2b510 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  nction is not.  
2b520 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69    ** operating i
2b530 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d  n direct-mode, m
2b540 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61  ake page 1 writa
2b550 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69  ble.  When not i
2b560 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  n .    ** direct
2b570 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73   mode, page 1 is
2b580 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20   always held in 
2b590 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20  cache and hence 
2b5a0 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20  the PagerGet(). 
2b5b0 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61     ** above is a
2b5c0 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c  lways successful
2b5d0 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57   - hence the ALW
2b5e0 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54  AYS on rc==SQLIT
2b5f0 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  E_OK..    */.   
2b600 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44   if( !DIRECT_MOD
2b610 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d  E && ALWAYS(rc==
2b620 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
2b630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b640 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
2b650 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
2b660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b670 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63   ){.      /* Inc
2b680 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2b690 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
2b6a0 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
2b6b0 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
2b6c0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2b6d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
2b6e0 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
2b6f0 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
2b700 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2b710 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32  r++;.      put32
2b720 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2b730 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
2b740 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
2b750 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75  ..      /* If ru
2b760 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20  nning in direct 
2b770 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
2b780 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
2b790 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   1 to the file. 
2b7a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52  */.      if( DIR
2b7b0 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20  ECT_MODE ){.    
2b7c0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
2b7d0 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70  zBuf = pPgHdr->p
2b7e0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61 73  Data;.        as
2b7f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
2b800 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20  FileSize>0 );.  
2b810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b820 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2b830 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
2b840 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29  er->pageSize, 0)
2b850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b870 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2b880 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2b890 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2b8a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b8b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
2b8c0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
2b8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b8e0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
2b8f0 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
2b900 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
2b910 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
2b920 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
2b930 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b940 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66  Sync the pager f
2b950 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69  ile to disk. Thi
2b960 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  s is a no-op for
2b970 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2b980 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
2b990 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
2b9a0 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
2b9b0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2b9c0 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61  , or called on a
2b9d0 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
2b9e0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20   it is a no-op, 
2b9f0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
2ba00 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2ba10 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  OK. Otherwise, a
2ba20 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2ba30 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2ba40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2ba50 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
2ba60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ba90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2baa0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
2bab0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2bac0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
2bad0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2bae0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2baf0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2bb00 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2bb10 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
2bb20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2bb30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
2bb40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2bb50 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
2bb60 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
2bb70 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
2bb80 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
2bb90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
2bba0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
2bbb0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
2bbc0 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
2bbd0 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
2bbe0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
2bbf0 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
2bc00 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
2bc10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
2bc20 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
2bc30 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
2bc40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
2bc50 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a  nsures that:.**.
2bc60 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
2bc70 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
2bc80 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74  counter is updat
2bc90 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a  ed,.**   * the j
2bca0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2bcb0 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f   (unless the ato
2bcc0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2bcd0 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c  zation is used),
2bce0 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74  .**   * all dirt
2bcf0 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  y pages are writ
2bd00 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
2bd10 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20  ase file, .**   
2bd20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2bd30 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
2bd40 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
2bd50 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  and.**   * the d
2bd60 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
2bd70 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ced. .**.** The 
2bd80 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20  only thing that 
2bd90 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
2bda0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
2bdb0 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  n is to finalize
2bdc0 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72   .** (delete, tr
2bdd0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
2bde0 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66  he first part of
2bdf0 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ) the journal fi
2be00 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74  le (or .** delet
2be10 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
2be20 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
2be30 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
2be40 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
2be50 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
2be60 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
2be70 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
2be80 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
2be90 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72   an sqlite3Pager
2bea0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
2beb0 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
2bec0 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  the final parame
2bed0 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69  ter - noSync - i
2bee0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
2bef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2bf00 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20  tself.** is not 
2bf10 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c  synced. The call
2bf20 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c  er must call sql
2bf30 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20  ite3PagerSync() 
2bf40 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73  directly to.** s
2bf50 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2bf60 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
2bf70 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65  ling CommitPhase
2bf80 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20  Two() to delete 
2bf90 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2bfa0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
2bfb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2bfc0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2bfd0 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  One(.  Pager *pP
2bfe0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
2bff0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2c000 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
2c010 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
2c020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c030 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
2c040 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
2c050 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53  ame */.  int noS
2c060 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
2c070 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c080 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79   to omit the xSy
2c090 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  nc on the db fil
2c0a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2c0b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2c0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2c0d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
2c0e0 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65  * The dbOrigSize
2c0f0 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 69 66   is never set if
2c100 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
2c110 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  F */.  assert( p
2c120 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2c130 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2c140 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61  LMODE_OFF || pPa
2c150 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
2c160 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  =0 );..  /* If a
2c170 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63   prior error occ
2c180 75 72 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  urred, this rout
2c190 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ine should not b
2c1a0 65 20 63 61 6c 6c 65 64 2e 20 20 52 4f 4c 4c 42  e called.  ROLLB
2c1b0 41 43 4b 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  ACK.  ** is the 
2c1c0 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 70  appropriate resp
2c1d0 6f 6e 73 65 20 74 6f 20 61 6e 20 65 72 72 6f 72  onse to an error
2c1e0 2c 20 6e 6f 74 20 43 4f 4d 4d 49 54 2e 20 20 47  , not COMMIT.  G
2c1f0 75 61 72 64 20 61 67 61 69 6e 73 74 0a 20 20 2a  uard against.  *
2c200 2a 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 73 20  * coding errors 
2c210 62 79 20 72 65 70 65 61 74 69 6e 67 20 74 68 65  by repeating the
2c220 20 70 72 69 6f 72 20 65 72 72 6f 72 2e 20 2a 2f   prior error. */
2c230 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2c240 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2c250 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
2c260 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52  rrCode;..  PAGER
2c270 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
2c280 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
2c290 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
2c2a0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
2c2b0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2c2c0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
2c2d0 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69  ->dbSize));..  i
2c2e0 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
2c2f0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2c300 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
2c310 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2c320 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
2c330 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2c340 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
2c350 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68     ** function h
2c360 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2c370 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f  called, it is mo
2c380 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48  stly a no-op.  H
2c390 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20  owever, any.    
2c3a0 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f  ** backup in pro
2c3b0 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62  gress needs to b
2c3c0 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20  e restarted..   
2c3d0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
2c3e0 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
2c3f0 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
2c400 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
2c410 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
2c420 53 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72  SYNCED && pPager
2c430 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2c440 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
2c450 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61  owing block upda
2c460 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
2c470 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20  ounter. Exactly 
2c480 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  how it.    ** do
2c490 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
2c4a0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
2c4b0 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
2c4c0 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2c4d0 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62  .    ** was enab
2c4e0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2c4f0 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
2c500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
2c510 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  ts the .    ** r
2c520 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
2c530 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
2c540 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20  tion: .    **.  
2c550 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69    **    * The fi
2c560 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2c570 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
2c580 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
2c590 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
2c5a0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
2c5b0 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
2c5c0 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d  **    * This com
2c5d0 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
2c5e0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
2c5f0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
2c600 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61  .    **    * Exa
2c610 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
2c620 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
2c630 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
2c640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2c650 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2c660 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2c670 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
2c680 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2c690 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
2c6a0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
2c6b0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
2c6c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2c6d0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2c6e0 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e  ange.    ** coun
2c6f0 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74  ter in 'indirect
2c700 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f  -mode'. If the o
2c710 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63  ptimization is c
2c720 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20  ompiled in but. 
2c730 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70     ** is not app
2c740 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20  licable to this 
2c750 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c  transaction, cal
2c760 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  l sqlite3Journal
2c770 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20  Create().    ** 
2c780 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
2c790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2c7a0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
2c7b0 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
2c7c0 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  ll.    ** pager_
2c7d0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c7e0 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2c7f0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2c800 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20  r in indirect.  
2c810 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20    ** mode. .    
2c820 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  **.    ** Otherw
2c830 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
2c840 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
2c850 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
2c860 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  licable,.    ** 
2c870 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
2c880 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c890 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2c8a0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2c8b0 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72  r.    ** in 'dir
2c8c0 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68  ect' mode. In th
2c8d0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2c8e0 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
2c8f0 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  ver be.    ** cr
2c900 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
2c910 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
2c920 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2c930 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2c940 52 49 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a  RITE.    PgHdr *
2c950 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
2c960 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2c970 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2c980 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2c990 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2c9a0 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  FF );.    if( !z
2c9b0 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e  Master && isOpen
2c9c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
2c9d0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
2c9e0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
2c9f0 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
2ca00 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ) .     && pPage
2ca10 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65  r->dbSize>=pPage
2ca20 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  r->dbFileSize.  
2ca30 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d     && (0==(pPg =
2ca40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2ca50 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2ca60 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d  pPCache)) || 0==
2ca70 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20  pPg->pDirty).   
2ca80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
2ca90 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
2caa0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76  change counter v
2cab0 69 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72  ia the direct-wr
2cac0 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  ite method. The 
2cad0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  .      ** follow
2cae0 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
2caf0 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  dify the in-memo
2cb00 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
2cb10 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20  n of page 1 .   
2cb20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65     ** to include
2cb30 20 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61   the updated cha
2cb40 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20  nge counter and 
2cb50 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20  then write page 
2cb60 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65  1 .      ** dire
2cb70 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
2cb80 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75  base file. Becau
2cb90 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63  se of the atomic
2cba0 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a  -write .      **
2cbb0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
2cbc0 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
2cbd0 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  m, this is safe.
2cbe0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2cbf0 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
2cc00 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
2cc10 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65  ager, 1);.    }e
2cc20 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2cc30 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
2cc40 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
2cc50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2cc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cc70 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2cc80 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2cc90 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
2cca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2ccb0 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67  lse.    rc = pag
2ccc0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2ccd0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2cce0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
2ccf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cd00 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2cd10 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20  se_one_exit;..  
2cd20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
2cd30 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
2cd40 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
2cd50 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
2cd60 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65   pages.    ** be
2cd70 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
2cd80 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
2cd90 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
2cda0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
2cdb0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73     ** file. This
2cdc0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2cdd0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2cde0 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mode..    **.   
2cdf0 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69   ** Before readi
2ce00 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74  ng the pages wit
2ce10 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c  h page numbers l
2ce20 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
2ce30 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76      ** current v
2ce40 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
2ce50 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65  Size, set dbSize
2ce60 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
2ce70 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  ue.    ** that i
2ce80 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74  t took at the st
2ce90 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
2cea0 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  action. Otherwis
2ceb0 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  e, the.    ** ca
2cec0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2ced0 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20  gerGet() return 
2cee0 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73  zeroed pages ins
2cef0 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20  tead of .    ** 
2cf00 72 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f  reading data fro
2cf10 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2cf20 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
2cf30 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f  ** When journal_
2cf40 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62  mode==OFF the db
2cf50 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61  OrigSize is alwa
2cf60 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73  ys zero, so this
2cf70 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65  .    ** block ne
2cf80 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72  ver runs if jour
2cf90 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20  nal_mode=OFF..  
2cfa0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2cfb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2cfc0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2cfd0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
2cfe0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
2cff0 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 50      && ALWAYS(pP
2d000 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2d010 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2d020 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 29 7b  MODE_OFF).    ){
2d030 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20  .      Pgno i;  
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d060 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2d070 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63  iable */.      c
2d080 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20  onst Pgno iSkip 
2d090 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
2d0a0 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64  pPager); /* Pend
2d0b0 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f  ing lock page */
2d0c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e  .      const Pgn
2d0d0 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  o dbSize = pPage
2d0e0 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20  r->dbSize;      
2d0f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61   /* Database ima
2d100 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20  ge size */ .    
2d110 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2d120 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
2d130 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72  gSize;.      for
2d140 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c  ( i=dbSize+1; i<
2d150 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
2d160 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
2d170 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
2d180 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
2d190 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
2d1a0 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
2d1b0 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
2d1c0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
2d1d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
2d1e0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20  journal */.     
2d1f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d200 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2d210 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , i, &pPage);.  
2d220 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2d230 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2d240 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2d250 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
2d260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d270 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b  gerWrite(pPage);
2d280 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d290 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2d2a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2d2b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d2c0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2d2d0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2d2e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d2f0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
2d300 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b  dbSize = dbSize;
2d310 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
2d320 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2d330 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
2d340 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
2d350 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20  rnal file. If a 
2d360 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a  master .    ** j
2d370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2d380 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2d390 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2d3a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a   journal file, .
2d3b0 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61      ** or if zMa
2d3c0 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f  ster is NULL (no
2d3d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29   master journal)
2d3e0 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
2d3f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
2d400 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69   */.    rc = wri
2d410 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
2d420 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
2d430 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2d440 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2d450 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2d460 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
2d470 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2d480 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d  ile. If the atom
2d490 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
2d4a0 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a  zation is being.
2d4b0 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69      ** used, thi
2d4c0 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  s call will not 
2d4d0 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  create the journ
2d4e0 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f  al file or perfo
2d4f0 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65  rm any.    ** re
2d500 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20  al IO..    */.  
2d510 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
2d520 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
2d530 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d540 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2d550 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2d560 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
2d570 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
2d580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d590 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  le. */.    rc = 
2d5a0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2d5b0 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63  list(sqlite3Pcac
2d5c0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2d5d0 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20  er->pPCache));. 
2d5e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d5f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2d600 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2d610 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
2d620 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d  ;.      goto com
2d630 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2d640 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  it;.    }.    sq
2d650 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
2d660 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
2d670 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  che);..    /* If
2d680 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
2d690 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  k is not the sam
2d6a0 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61  e size as the da
2d6b0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20  tabase image,.  
2d6c0 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61    ** then use pa
2d6d0 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20  ger_truncate to 
2d6e0 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74  grow or shrink t
2d6f0 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20  he file here..  
2d700 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
2d710 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61  ger->dbSize!=pPa
2d720 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2d730 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e  ){.      Pgno nN
2d740 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ew = pPager->dbS
2d750 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64  ize - (pPager->d
2d760 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f  bSize==PAGER_MJ_
2d770 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
2d780 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2d790 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2d7a0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  R_EXCLUSIVE );. 
2d7b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2d7c0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
2d7d0 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   nNew);.      if
2d7e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d7f0 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2d800 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2d810 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61    }..    /* Fina
2d820 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61  lly, sync the da
2d830 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2d840 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2d850 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79  >noSync && !noSy
2d860 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
2d870 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
2d880 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2d890 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
2d8a0 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
2d8b0 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
2d8c0 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
2d8d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2d8e0 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
2d8f0 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  }..commit_phase_
2d900 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  one_exit:.  retu
2d910 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2d920 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
2d930 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
2d940 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d950 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65   has been comple
2d960 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20  tely.** updated 
2d970 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
2d980 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
2d990 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2d9a0 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79  action and.** sy
2d9b0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68  nced to disk. Th
2d9c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
2d9d0 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74  till exists in t
2d9e0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
2d9f0 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69  ** though, and i
2da00 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
2da10 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
2da20 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61   it will eventua
2da30 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61  lly.** be used a
2da40 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
2da50 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
2da60 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
2da70 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2da80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
2da90 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
2daa0 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20  al file, either 
2dab0 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a  by deleting, .**
2dac0 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70   truncating or p
2dad0 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67  artially zeroing
2dae0 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20   it, so that it 
2daf0 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a  cannot be used .
2db00 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e  ** for hot-journ
2db10 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63  al rollback. Onc
2db20 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74  e this is done t
2db30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2db40 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79  s.** irrevocably
2db50 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2db60 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2db70 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
2db80 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2db90 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ed and the pager
2dba0 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74  .** moves into t
2dbb0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2dbc0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2dbd0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2dbe0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2dbf0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2dc00 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
2dc10 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2dc20 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2dc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2dc40 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2dc50 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2dc60 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
2dc70 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20  lled if a prior 
2dc80 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
2dc90 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20  ed..  ** But if 
2dca0 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67  (due to a coding
2dcb0 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65   error elsewhere
2dcc0 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20   in the system) 
2dcd0 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a  it does get.  **
2dce0 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65   called, just re
2dcf0 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72  turn the same er
2dd00 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74  ror code without
2dd10 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
2dd20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2dd30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2dd40 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
2dd50 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
2dd60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2dd70 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2dd80 6c 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72  led if the pager
2dd90 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65   is not in at le
2dda0 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52  ast.  ** PAGER_R
2ddb0 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41  ESERVED state. A
2ddc0 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65  nd indeed SQLite
2ddd0 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73   never does this
2dde0 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a  . But it is.  **
2ddf0 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68   nice to have th
2de00 69 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73  is defensive tes
2de10 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20  t here anyway.. 
2de20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2de30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
2de40 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20  GER_RESERVED) ) 
2de50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2de60 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70  ROR;..  /* An op
2de70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74  timization. If t
2de80 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2de90 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
2dea0 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a  ified during.  *
2deb0 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2dec0 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  on, the pager is
2ded0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2dee0 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69  usive-mode and i
2def0 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72  s.  ** using per
2df00 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  sistent journals
2df10 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2df20 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2df30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2df40 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2df50 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
2df60 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ly contains a si
2df70 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  ngle journal .  
2df80 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74  ** header with t
2df90 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65  he nRec field se
2dfa0 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20  t to 0. If such 
2dfb0 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65  a journal is use
2dfc0 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  d as.  ** a hot-
2dfd0 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68  journal during h
2dfe0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2dff0 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77  ack, 0 changes w
2e000 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a  ill be made.  **
2e010 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2e020 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20   file. So there 
2e030 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65  is no need to ze
2e040 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  ro the journal .
2e050 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e    ** header. Sin
2e060 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
2e070 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2e080 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  e, there is no n
2e090 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70  eed.  ** to drop
2e0a0 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65   any locks eithe
2e0b0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  r..  */.  if( pP
2e0c0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2e0d0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
2e0e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
2e0f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2e100 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2e110 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2e120 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ST.  ){.    asse
2e130 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2e140 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
2e150 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
2e160 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2e170 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
2e180 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
2e190 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
2e1a0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
2e1b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2e1c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
2e1d0 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
2e1e0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2e1f0 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
2e200 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2e210 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2e220 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2e230 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2e240 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2e250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
2e260 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
2e270 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
2e280 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
2e290 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
2e2a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2e2b0 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
2e2c0 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
2e2d0 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
2e2e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2e2f0 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
2e300 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2e310 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
2e320 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
2e330 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
2e340 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
2e350 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
2e360 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
2e370 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
2e380 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
2e390 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
2e3a0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2e3b0 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
2e3c0 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
2e3d0 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
2e3e0 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
2e3f0 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
2e400 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
2e410 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
2e420 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2e430 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
2e440 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
2e450 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2e460 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
2e470 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
2e480 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2e490 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
2e4a0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
2e4b0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
2e4c0 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
2e4d0 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2e4e0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2e4f0 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
2e500 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
2e510 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
2e520 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
2e530 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
2e540 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
2e550 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
2e560 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
2e570 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
2e580 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
2e590 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
2e5a0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
2e5b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
2e5c0 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
2e5d0 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
2e5e0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
2e5f0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2e600 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
2e610 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
2e620 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cussful, also at
2e630 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
2e640 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
2e650 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
2e660 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
2e670 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2e680 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
2e690 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
2e6a0 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
2e6b0 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
2e6c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2e6d0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
2e6e0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2e6f0 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
2e700 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
2e710 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2e720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
2e730 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
2e740 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
2e750 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
2e760 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
2e770 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
2e780 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
2e790 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
2e7a0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
2e7b0 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
2e7c0 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
2e7d0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
2e7e0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2e7f0 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2e800 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
2e810 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
2e820 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
2e830 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
2e840 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
2e850 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
2e860 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
2e870 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
2e880 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
2e890 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
2e8a0 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
2e8b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
2e8c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
2e8d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
2e8e0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2e8f0 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
2e900 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
2e910 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
2e920 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
2e930 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
2e940 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
2e950 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2e960 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
2e970 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
2e980 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
2e990 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
2e9a0 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
2e9b0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
2e9c0 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
2e9d0 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
2e9e0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
2e9f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2ea00 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
2ea10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2ea20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ea30 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2ea40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2ea50 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
2ea60 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
2ea70 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2ea80 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70  ger)));.  if( !p
2ea90 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2eaa0 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  d || !isOpen(pPa
2eab0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2eac0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2ead0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2eae0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2eaf0 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  aster);.  }else 
2eb00 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
2eb10 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2eb20 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
2eb30 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
2eb40 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2eb50 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
2eb60 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
2eb70 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2eb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2eb90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2eba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2ebb0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2ebc0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2ebd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2ebe0 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  2;.      rc = pa
2ebf0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2ec00 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ger, 0);.      r
2ec10 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
2ec20 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2ec30 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2ec40 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
2ec50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ec60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
2ec70 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
2ec80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2ec90 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
2eca0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2ecb0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
2ecc0 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
2ecd0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2ece0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2ecf0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2ed00 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
2ed10 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
2ed20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
2ed30 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2ed40 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
2ed50 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
2ed60 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
2ed70 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
2ed80 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
2ed90 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
2eda0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
2edb0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
2edc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2edd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2ede0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
2edf0 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
2ee00 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
2ee10 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2ee20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2ee30 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
2ee40 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
2ee50 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
2ee60 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
2ee70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2ee80 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
2ee90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2eea0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2eeb0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2eec0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2eed0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
2eee0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2eef0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2ef00 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
2ef10 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2ef20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2ef30 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2ef40 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2ef50 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2ef60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ef70 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2ef80 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
2ef90 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2efa0 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
2efb0 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
2efc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2efd0 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
2efe0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2eff0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
2f000 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
2f010 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
2f020 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
2f030 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
2f040 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
2f050 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2f060 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2f070 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2f080 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
2f090 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2f0a0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2f0b0 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
2f0c0 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
2f0d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2f0e0 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
2f0f0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2f100 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e  ? (int) pPager->
2f110 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61  dbSize : -1;.  a
2f120 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
2f130 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
2f140 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2f150 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
2f160 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
2f170 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
2f180 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
2f190 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
2f1a0 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
2f1b0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
2f1c0 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
2f1d0 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
2f1e0 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
2f1f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2f200 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2f210 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
2f220 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2f230 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
2f240 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2f250 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
2f260 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2f270 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c  t there are at l
2f280 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20  east nSavepoint 
2f290 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e  savepoints open.
2f2a0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   If there are.**
2f2b0 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20   currently less 
2f2c0 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73  than nSavepoints
2f2d0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e   open, then open
2f2e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
2f2f0 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61  epoints.** to ma
2f300 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72  ke up the differ
2f310 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d  ence. If the num
2f320 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
2f330 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  s is already.** 
2f340 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f  equal to nSavepo
2f350 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  int, then this f
2f360 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2f370 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  op..**.** If a m
2f380 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2f390 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
2f3a0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
2f3b0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  . If an error .*
2f3c0 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  * occurs while o
2f3d0 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a  pening the sub-j
2f3e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
2f3f0 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  n an IO error co
2f400 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  de is.** returne
2f410 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
2f420 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
2f430 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2f440 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
2f450 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
2f460 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
2f470 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2f4a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
2f4b0 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d  urrent = pPager-
2f4c0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  >nSavepoint;    
2f4d0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
2f4e0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2f4f0 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53  nts */..  if( nS
2f500 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e  avepoint>nCurren
2f510 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  t && pPager->use
2f520 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
2f530 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f550 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2f560 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2f570 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
2f580 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20  t *aNew;        
2f590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2f5a0 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  w Pager.aSavepoi
2f5b0 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20  nt array */..   
2f5c0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72 65   /* Either there
2f5d0 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f   is no active jo
2f5e0 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62  urnal or the sub
2f5f0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  -journal is open
2f600 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   or .    ** the 
2f610 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79  journal is alway
2f620 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
2f630 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ry */.    assert
2f640 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2f650 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65  oint==0 || isOpe
2f660 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2f670 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ||.            p
2f680 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2f690 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2f6a0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
2f6b0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
2f6c0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2f6d0 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
2f6e0 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
2f6f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
2f700 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
2f710 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
2f720 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
2f730 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
2f740 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
2f750 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
2f760 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
2f770 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
2f780 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
2f790 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
2f7a0 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
2f7b0 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
2f7c0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
2f7d0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
2f7e0 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
2f7f0 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
2f800 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
2f810 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
2f820 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f830 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2f840 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
2f850 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
2f860 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
2f870 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
2f880 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
2f890 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
2f8a0 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20  epoint = aNew;. 
2f8b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
2f8c0 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
2f8d0 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
2f8e0 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
2f8f0 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
2f900 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
2f910 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
2f920 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53  =nCurrent; ii<nS
2f930 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
2f940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f950 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2f960 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77  id );.      aNew
2f970 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61  [ii].nOrig = pPa
2f980 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2f990 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
2f9a0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 41 4c  ager->jfd) && AL
2f9b0 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75  WAYS(pPager->jou
2f9c0 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
2f9d0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
2f9e0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
2f9f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
2fa00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fa10 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73    aNew[ii].iOffs
2fa20 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  et = JOURNAL_HDR
2fa30 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
2fa40 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b     }.      aNew[
2fa50 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50  ii].iSubRec = pP
2fa60 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20  ager->nSubRec;. 
2fa70 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49       aNew[ii].pI
2fa80 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c  nSavepoint = sql
2fa90 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
2faa0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
2fab0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65  ;.      if( !aNe
2fac0 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  w[ii].pInSavepoi
2fad0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  nt ){.        re
2fae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2faf0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
2fb00 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
2fb10 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
2fb20 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
2fb30 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20  ady opened. */. 
2fb40 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
2fb50 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2fb60 20 20 20 20 61 73 73 65 72 74 54 72 75 6e 63 61      assertTrunca
2fb70 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
2fb80 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ger);.  }..  ret
2fb90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2fba0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2fbb0 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
2fbc0 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
2fbd0 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70  (commit) a savep
2fbe0 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76  oint..** The sav
2fbf0 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73  epoint to releas
2fc00 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  e or rollback ne
2fc10 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f  ed not be the mo
2fc20 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20  st recently .** 
2fc30 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
2fc40 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
2fc50 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20  er op is always 
2fc60 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
2fc70 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56  _ROLLBACK or SAV
2fc80 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a  EPOINT_RELEASE..
2fc90 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45  ** If it is SAVE
2fca0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
2fcb0 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20  hen release and 
2fcc0 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65  destroy the save
2fcd0 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e  point with.** in
2fce0 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  dex iSavepoint. 
2fcf0 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
2fd00 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
2fd10 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  n rollback all c
2fd20 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68  hanges.** that h
2fd30 61 76 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e  ave occurred sin
2fd40 63 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ce the specified
2fd50 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63   savepoint was c
2fd60 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  reated..**.** Th
2fd70 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72  e savepoint to r
2fd80 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
2fd90 73 65 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  se is identified
2fda0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a   by parameter .*
2fdb0 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20  * iSavepoint. A 
2fdc0 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73  value of 0 means
2fdd0 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
2fde0 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  he outermost sav
2fdf0 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66  epoint.** (the f
2fe00 69 72 73 74 20 63 72 65 61 74 65 64 29 2e 20 41  irst created). A
2fe10 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72   value of (Pager
2fe20 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d  .nSavepoint-1) m
2fe30 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20  eans operate.** 
2fe40 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
2fe50 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 61 76  ntly created sav
2fe60 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 65  epoint. If iSave
2fe70 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
2fe80 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e   than.** (Pager.
2fe90 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74  nSavepoint-1), t
2fea0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2feb0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2fec0 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69 76  .** If a negativ
2fed0 65 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  e value is passe
2fee0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2fef0 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  on, then the cur
2ff00 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
2ff10 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
2ff20 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
2ff30 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67  erent to calling
2ff40 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
2ff50 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63 61  rRollback() beca
2ff60 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
2ff70 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69  n does not termi
2ff80 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e  nate.** the tran
2ff90 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63  saction or unloc
2ffa0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
2ffb0 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65 73  it just restores
2ffc0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
2ffd0 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
2ffe0 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
2fff0 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  l state. .**.** 
30000 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c  In any case, all
30010 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68   savepoints with
30020 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
30030 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e  r than iSavepoin
30040 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f  t .** are destro
30050 79 65 64 2e 20 49 66 20 74 68 69 73 20 69 73 20  yed. If this is 
30060 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61 74  a release operat
30070 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49  ion (op==SAVEPOI
30080 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20  NT_RELEASE),.** 
30090 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  then savepoint i
300a0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c 73  Savepoint is als
300b0 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  o destroyed..**.
300c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
300d0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
300e0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65  TE_NOMEM if a me
300f0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
30100 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20  fails,.** or an 
30110 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
30120 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
30130 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  urs while rollin
30140 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76  g back a .** sav
30150 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72  epoint. If no er
30160 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49  rors occur, SQLI
30170 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
30180 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
30190 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
301a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
301b0 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
301c0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
301d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
301e0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
301f0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
30200 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
30210 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
30220 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
30230 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  t>=0 || op==SAVE
30240 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
30250 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f  ;..  if( iSavepo
30260 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  int<pPager->nSav
30270 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e  epoint ){.    in
30280 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
30290 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
302a0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
302b0 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
302c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d  /* Number of rem
302d0 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  aining savepoint
302e0 73 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 2e  s after this op.
302f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   */..    /* Figu
30300 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
30310 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20  savepoints will 
30320 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20  still be active 
30330 61 66 74 65 72 20 74 68 69 73 0a 20 20 20 20 2a  after this.    *
30340 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f  * operation. Sto
30350 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  re this value in
30360 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65 65   nNew. Then free
30370 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63   resources assoc
30380 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77 69  iated .    ** wi
30390 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  th any savepoint
303a0 73 20 74 68 61 74 20 61 72 65 20 64 65 73 74 72  s that are destr
303b0 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  oyed by this ope
303c0 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
303d0 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70     nNew = iSavep
303e0 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45  oint + (op==SAVE
303f0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  POINT_ROLLBACK);
30400 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77  .    for(ii=nNew
30410 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
30420 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
30430 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
30440 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
30450 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
30460 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
30470 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
30480 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
30490 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  nNew;..    /* If
304a0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
304b0 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70  ack operation, p
304c0 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65 63  layback the spec
304d0 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  ified savepoint.
304e0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
304f0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20  is a temp-file, 
30500 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
30510 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
30520 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a 20  file has.    ** 
30530 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
30540 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
30550 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  e there have bee
30560 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a  n no changes to.
30570 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
30580 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65  ase file, so the
30590 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74   playback operat
305a0 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70 70  ion can be skipp
305b0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
305c0 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
305d0 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69 73 4f  _ROLLBACK && isO
305e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
305f0 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53   ){.      PagerS
30600 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
30610 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29  oint = (nNew==0)
30620 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76  ?0:&pPager->aSav
30630 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a  epoint[nNew-1];.
30640 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30650 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
30660 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 65 70  t(pPager, pSavep
30670 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73  oint);.      ass
30680 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44  ert(rc!=SQLITE_D
30690 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ONE);.    }.  . 
306a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
306b0 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
306c0 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
306d0 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
306e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
306f0 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20  journal to zero 
30700 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a  bytes in size. *
30710 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d  /.    if( nNew==
30720 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 && op==SAVEPOI
30730 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20 69 73  NT_RELEASE && is
30740 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
30750 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
30760 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
30770 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  K );.      rc = 
30780 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
30790 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
307a0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
307b0 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20  ->nSubRec = 0;. 
307c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
307d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
307e0 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
307f0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
30800 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
30810 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
30820 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
30830 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
30840 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
30850 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
30860 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
30870 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
30880 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
30890 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
308a0 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
308b0 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
308c0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
308d0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
308e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
308f0 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
30900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30910 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
30920 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
30930 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
30940 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
30950 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
30960 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
30970 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
30980 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
30990 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
309a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
309b0 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
309c0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
309d0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
309e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
309f0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
30a00 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
30a10 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
30a20 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
30a30 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
30a40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
30a50 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
30a60 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
30a70 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
30a80 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
30a90 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
30aa0 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
30ab0 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
30ac0 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
30ad0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30ae0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
30af0 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
30b00 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
30b10 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ODEC./*.** Set o
30b20 72 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63  r retrieve the c
30b30 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
30b40 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ger.*/.static vo
30b50 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
30b60 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
30b70 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
30b80 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
30b90 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
30ba0 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
30bb0 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
30bc0 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f  *,int,int),.  vo
30bd0 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
30be0 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20  (void*),.  void 
30bf0 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28  *pCodec.){.  if(
30c00 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
30c10 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
30c20 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
30c30 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67  >pCodec);.  pPag
30c40 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
30c50 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  dec;.  pPager->x
30c60 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20  CodecSizeChng = 
30c70 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a  xCodecSizeChng;.
30c80 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
30c90 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65  Free = xCodecFre
30ca0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  e;.  pPager->pCo
30cb0 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20  dec = pCodec;.  
30cc0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
30cd0 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69  pPager);.}.stati
30ce0 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  c void *sqlite3P
30cf0 61 67 65 72 47 65 74 43 6f 64 65 63 28 50 61 67  agerGetCodec(Pag
30d00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
30d10 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 43  eturn pPager->pC
30d20 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  odec;.}.#endif..
30d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30d40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
30d50 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
30d60 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
30d70 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
30d80 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ile..**.** There
30d90 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
30da0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
30db0 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
30dc0 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
30dd0 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
30de0 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
30df0 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
30e00 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
30e10 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
30e20 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
30e30 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69  ocated at pgno i
30e40 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
30e50 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
30e60 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
30e70 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79  not put there by
30e80 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
30e90 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
30ea0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
30eb0 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  Pg remain valid.
30ec0 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
30ed0 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
30ee0 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28  iated with pPg (
30ef0 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
30f00 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
30f10 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
30f20 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
30f30 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
30f40 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
30f50 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
30f60 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
30f70 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
30f80 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
30f90 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
30fa0 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
30fb0 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
30fc0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
30fd0 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
30fe0 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
30ff0 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
31000 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
31010 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
31020 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
31030 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
31040 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
31050 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a  s active)..**.**
31060 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61   If the fourth a
31070 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69  rgument, isCommi
31080 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t, is non-zero, 
31090 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  then this page i
310a0 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64  s being.** moved
310b0 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61   as part of a da
310c0 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a  tabase reorganiz
310d0 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72  ation just befor
310e0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
310f0 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  n .** is being c
31100 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69  ommitted. In thi
31110 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75  s case, it is gu
31120 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
31130 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
31140 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74  .** pPg refers t
31150 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  o will not be wr
31160 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77  itten to again w
31170 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
31180 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
31190 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
311a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
311b0 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
311c0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
311d0 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f  ror.** occurs. O
311e0 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 65 74  therwise, it ret
311f0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
31200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
31210 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
31220 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
31230 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
31240 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29  o, int isCommit)
31250 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
31260 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
31270 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69   /* The page bei
31280 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
31290 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  */.  Pgno needSy
312a0 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20  ncPgno = 0;     
312b0 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f    /* Old value o
312c0 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20  f pPg->pgno, if 
312d0 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
312e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
312f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31300 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
31310 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67  e */.  Pgno orig
31320 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
31330 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69      /* The origi
31340 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
31350 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
31360 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
31370 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62  /* If the page b
31380 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69  eing moved is di
31390 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20  rty and has not 
313a0 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68  been saved by th
313b0 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61  e latest.  ** sa
313c0 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61  vepoint, then sa
313d0 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
313e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
313f0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  age into the .  
31400 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e  ** sub-journal n
31410 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ow. This is requ
31420 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
31430 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
31440 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nario:.  **.  **
31450 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
31460 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
31470 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20   X, then modify 
31480 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20  it in memory>.  
31490 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
314a0 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20   one;.  **      
314b0 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f   <Move page X to
314c0 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a   location Y>.  *
314d0 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
314e0 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  O one;.  **.  **
314f0 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20   If page X were 
31500 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
31510 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68  he sub-journal h
31520 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ere, it would no
31530 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62  t.  ** be possib
31540 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74  le to restore it
31550 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20  s contents when 
31560 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
31570 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65   one".  ** state
31580 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f  ment were is pro
31590 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  cessed..  **.  *
315a0 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  * subjournalPage
315b0 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61  () may need to a
315c0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
315d0 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
315e0 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f   into.  ** one o
315f0 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
31600 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69   bitvecs. This i
31610 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69  s the reason thi
31620 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
31630 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
31640 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20  E_NOMEM..  */.  
31650 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
31660 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26  GHDR_DIRTY .   &
31670 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
31680 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51  ge(pPg).   && SQ
31690 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
316a0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
316b0 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  g)).  ){.    ret
316c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
316d0 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45  AGERTRACE(("MOVE
316e0 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
316f0 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
31700 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
31710 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
31720 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
31730 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
31740 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
31750 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  gno));.  IOTRACE
31760 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
31770 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
31780 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
31790 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
317a0 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
317b0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
317c0 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63  page pPg->pgno c
317d0 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  an.  ** be writt
317e0 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67  en to, store pPg
317f0 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20  ->pgno in local 
31800 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e  variable needSyn
31810 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cPgno..  **.  **
31820 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74   If the isCommit
31830 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
31840 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
31850 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
31860 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
31870 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
31880 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
31890 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e  abase page pPg->
318a0 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62  pgno .  ** can b
318b0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
318c0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
318d0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
318e0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74  t to write to it
318f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ..  */.  if( (pP
31900 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
31910 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73  EED_SYNC) && !is
31920 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65  Commit ){.    ne
31930 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
31940 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
31950 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
31960 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
31970 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
31980 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  igSize );.    as
31990 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
319a0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
319b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
319c0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
319d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
319e0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
319f0 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
31a00 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
31a10 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
31a20 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
31a30 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
31a40 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
31a50 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
31a60 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
31a70 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
31a80 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
31a90 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
31aa0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
31ab0 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
31ac0 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
31ad0 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
31ae0 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d  SYNC;.  pPgOld =
31af0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
31b00 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
31b10 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c  ssert( !pPgOld |
31b20 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  | pPgOld->nRef==
31b30 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  1 );.  if( pPgOl
31b40 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  d ){.    pPg->fl
31b50 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e  ags |= (pPgOld->
31b60 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
31b70 5f 53 59 4e 43 29 3b 0a 20 20 20 20 73 71 6c 69  _SYNC);.    sqli
31b80 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
31b90 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72  gOld);.  }..  or
31ba0 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  igPgno = pPg->pg
31bb0 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  no;.  sqlite3Pca
31bc0 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e  cheMove(pPg, pgn
31bd0 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  o);.  sqlite3Pca
31be0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
31bf0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  );.  pPager->dbM
31c00 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
31c10 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
31c20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
31c30 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
31c40 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
31c50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
31c60 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
31c70 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
31c80 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
31c90 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
31ca0 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
31cb0 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
31cc0 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
31cd0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
31ce0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
31cf0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
31d00 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22  * "is journaled"
31d10 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73   bitvec flag has
31d20 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
31d30 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
31d40 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c  died by.    ** l
31d50 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20  oading the page 
31d60 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
31d70 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
31d80 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
31d90 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67  ync .    ** flag
31da0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31db0 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
31dc0 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
31dd0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
31de0 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
31df0 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
31e00 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
31e10 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
31e20 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
31e30 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
31e40 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
31e50 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
31e60 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
31e70 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
31e80 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
31e90 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
31ea0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
31eb0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
31ec0 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
31ed0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
31ee0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
31ef0 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
31f00 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
31f10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31f20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
31f30 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
31f40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31f50 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
31f60 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
31f70 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
31f80 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
31f90 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
31fa0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
31fb0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
31fc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48  ..    */.    PgH
31fd0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
31fe0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31ff0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
32000 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32010 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
32020 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
32030 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
32040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32050 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
32060 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno<=pPager->db
32070 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
32080 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32090 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30  er->pTmpSpace!=0
320a0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
320b0 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
320c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
320d0 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  l, needSyncPgno,
320e0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
320f0 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
32100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
32110 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
32120 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
32130 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32140 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21  ->noSync==0 && !
32150 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67  MEMDB );.    pPg
32160 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  Hdr->flags |= PG
32170 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
32180 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
32190 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  MakeDirty(pPgHdr
321a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
321b0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
321c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
321d0 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
321e0 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65  y database, make
321f0 20 73 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e   sure the origin
32200 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65  al page continue
32210 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c  s.  ** to exist,
32220 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
32230 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
32240 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 57 65  o roll back.  We
32250 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74   allocate.  ** t
32260 68 65 20 70 61 67 65 20 6e 6f 77 2c 20 69 6e 73  he page now, ins
32270 74 65 61 64 20 6f 66 20 61 74 20 72 6f 6c 6c 62  tead of at rollb
32280 61 63 6b 2c 20 62 65 63 61 75 73 65 20 77 65 20  ack, because we 
32290 63 61 6e 20 62 65 74 74 65 72 20 64 65 61 6c 0a  can better deal.
322a0 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 6f 75 74    ** with an out
322b0 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72  -of-memory error
322c0 20 6e 6f 77 2e 20 20 54 69 63 6b 65 74 20 23 33   now.  Ticket #3
322d0 37 36 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  761..  */.  if( 
322e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 44 62 50  MEMDB ){.    DbP
322f0 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 72  age *pNew;.    r
32300 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32310 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
32320 6f 72 69 67 50 67 6e 6f 2c 20 26 70 4e 65 77 2c  origPgno, &pNew,
32330 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   1);.    if( rc!
32340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32350 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
32360 65 4d 6f 76 65 28 70 50 67 2c 20 6f 72 69 67 50  eMove(pPg, origP
32370 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gno);.      retu
32380 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
32390 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
323a0 65 66 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ef(pNew);.  }.. 
323b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
323c0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
323d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
323e0 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
323f0 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
32400 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
32410 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
32420 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
32430 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
32440 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d  ->nRef>0 || pPg-
32450 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
32460 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
32470 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pData;.}../*.** 
32480 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
32490 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
324a0 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
324b0 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
324c0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
324d0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
324e0 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
324f0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
32500 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
32510 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
32520 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a  g->pExtra;.}../*
32530 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
32540 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
32550 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
32560 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
32570 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
32580 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
32590 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
325a0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
325b0 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
325c0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
325d0 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
325e0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
325f0 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
32600 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
32610 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
32620 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
32630 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
32640 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
32650 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
32660 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
32670 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
32680 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
32690 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
326a0 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
326b0 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
326c0 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
326d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
326e0 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
326f0 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
32700 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
32710 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
32720 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
32730 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32740 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
32750 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
32760 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
32770 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
32780 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
32790 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
327a0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
327b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
327c0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
327d0 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
327e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
327f0 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
32800 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
32810 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
32820 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
32830 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32840 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20   = (u8)eMode;.  
32850 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
32860 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32870 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eMode;.}../*.** 
32880 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72  Get/set the jour
32890 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  nal-mode for thi
328a0 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
328b0 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
328c0 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
328d0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
328e0 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20  ODE_QUERY.**    
328f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32900 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50  E_DELETE.**    P
32910 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32920 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  _TRUNCATE.**    
32930 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32940 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  E_PERSIST.**    
32950 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32960 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45  E_OFF.**    PAGE
32970 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
32980 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  MORY.**.** If th
32990 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
329a0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20  ot _QUERY, then 
329b0 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
329c0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
329d0 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  * value specifie
329e0 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20  d if the change 
329f0 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65  is allowed.  The
32a00 20 63 68 61 6e 67 65 20 69 73 20 64 69 73 61 6c   change is disal
32a10 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  lowed.** for the
32a20 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f   following reaso
32a30 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ns:.**.**   *  A
32a40 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
32a50 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61  base can only ha
32a60 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d  ve its journal_m
32a70 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a  ode set to _OFF.
32a80 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f  **      or _MEMO
32a90 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54  RY..**.**   *  T
32aa0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  he journal mode 
32ab0 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  may not be chang
32ac0 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73  ed while a trans
32ad0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
32ae0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
32af0 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68  rned indicate th
32b00 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
32b10 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75  bly updated) jou
32b20 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
32b30 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  t sqlite3PagerJo
32b40 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
32b50 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
32b60 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
32b70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32b80 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  NALMODE_QUERY.  
32b90 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32ba0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32bb0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20  LMODE_DELETE.   
32bc0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32bd0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32be0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20  MODE_TRUNCATE.  
32bf0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32c00 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32c10 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
32c20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32c30 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32c40 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
32c50 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
32c60 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32c70 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61  DE_MEMORY );.  a
32c80 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
32c90 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30  RNALMODE_QUERY<0
32ca0 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
32cb0 3d 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42  =0.   && (!MEMDB
32cc0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32cd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
32ce0 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
32cf0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32d00 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
32d10 46 46 29 0a 20 20 20 26 26 20 21 70 50 61 67 65  FF).   && !pPage
32d20 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20  r->dbModified.  
32d30 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61   && (!isOpen(pPa
32d40 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d  ger->jfd) || 0==
32d50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
32d60 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ff).  ){.    if(
32d70 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32d80 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71  jfd) ){.      sq
32d90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
32da0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
32db0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
32dc0 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65  rnalMode = (u8)e
32dd0 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
32de0 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
32df0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a  journalMode;.}..
32e00 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
32e10 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65  e size-limit use
32e20 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  d for persistent
32e30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
32e40 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68  **.** Setting th
32e50 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20  e size limit to 
32e60 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69  -1 means no limi
32e70 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a  t is enforced..*
32e80 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  * An attempt to 
32e90 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c  set a limit smal
32ea0 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61  ler than -1 is a
32eb0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73   no-op..*/.i64 s
32ec0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
32ed0 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65  alSizeLimit(Page
32ee0 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69  r *pPager, i64 i
32ef0 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c  Limit){.  if( iL
32f00 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20  imit>=-1 ){.    
32f10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
32f20 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  izeLimit = iLimi
32f30 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
32f40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
32f50 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  izeLimit;.}../*.
32f60 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
32f70 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67 65  ter to the pPage
32f80 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61  r->pBackup varia
32f90 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20  ble. The backup 
32fa0 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63  module.** in bac
32fb0 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20  kup.c maintains 
32fc0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
32fd0 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68  his variable. Th
32fe0 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65  is module.** use
32ff0 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73  s it opaquely as
33000 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
33010 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
33020 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71  tart() and.** sq
33030 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
33040 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c  e() only..*/.sql
33050 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71  ite3_backup **sq
33060 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75 70  lite3PagerBackup
33070 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Ptr(Pager *pPage
33080 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50  r){.  return &pP
33090 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d  ager->pBackup;.}
330a0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
330b0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
330c0 2f 0a                                            /.