/ Hex Artifact Content
Login

Artifact d98f56128e849083f2f612196efebd982c491fea:


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 34 39  : pager.c,v 1.49
0350: 37 20 32 30 30 38 2f 31 30 2f 30 37 20 31 31 3a  7 2008/10/07 11:
0360: 35 31 3a 32 30 20 64 61 6e 69 65 6c 6b 31 39 37  51:20 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
03f0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0400: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0410: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0420: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0440: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0450: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0460: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0470: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
0480: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
0490: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04a0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04b0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04c0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
04e0: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
04f0: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0500: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0510: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0520: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0540: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0550: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0560: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0570: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
0580: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
0590: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05a0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05b0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05d0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
05e0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
05f0: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0600: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0610: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0620: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0630: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0640: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0650: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0660: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0670: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
0680: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
0690: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06a0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06b0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06c0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06d0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
06e0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
06f0: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0700: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0710: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0720: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0730: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0740: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0750: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0760: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0770: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
0780: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
0790: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07a0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07b0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
07e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
07f0: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0820: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0830: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0840: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0850: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0860: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0870: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
0880: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
0890: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08a0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08c0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08d0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
08e0: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0900: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0910: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0920: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0950: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0960: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0970: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
0980: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
0990: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09a0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09d0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
09e0: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
09f0: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a10: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a20: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a30: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a50: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a60: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a70: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0a80: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ab0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ac0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0af0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b00: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b10: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b20: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b30: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b60: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b70: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0ba0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bb0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0bc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bd0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0be0: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0bf0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c00: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c10: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c20: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c30: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c60: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c70: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0c80: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0ca0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cb0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0cc0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0cf0: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d00: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d10: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d20: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d30: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d40: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d50: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0d80: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0d90: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0da0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0db0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0dc0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0dd0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0de0: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0df0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e00: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e10: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e20: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e30: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e40: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e50: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e60: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e70: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0e80: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0e90: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ea0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0eb0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ec0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ed0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0ee0: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0ef0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f00: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f10: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f20: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f30: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f40: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f50: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f60: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f70: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0f80: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0f90: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fa0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fb0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fc0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0fd0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
0fe0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0ff0: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1000: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1010: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1020: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1030: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1040: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1050: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1060: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1070: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
1080: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1090: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10a0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10b0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10c0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10d0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
10e0: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
10f0: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1100: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1110: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1120: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1130: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1140: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1150: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1160: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1170: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
1180: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1190: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11a0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11b0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11c0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11d0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
11e0: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
11f0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1200: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1210: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1220: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1230: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1240: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1250: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1260: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1270: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
1280: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
1290: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12a0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12b0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12c0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12d0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
12e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
12f0: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1300: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1310: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1320: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1330: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1340: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1350: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1360: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1370: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
1380: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
1390: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13a0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13b0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13c0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13d0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
13e0: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
13f0: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1400: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1410: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1420: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1430: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1440: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1450: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1460: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1470: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
1480: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
1490: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14a0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14b0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14d0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
14e0: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
14f0: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1500: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1510: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1520: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1530: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1540: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1550: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1560: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1570: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
1580: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
1590: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15b0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15c0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f   (((X)+7)&~7)../
15d0: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
15e0: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
15f0: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1600: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1610: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1620: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1630: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
1640: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
1650: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
1660: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
1670: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
1680: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
1690: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
16a0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
16b0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
16c0: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
16d0: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
16e0: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
16f0: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
1700: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
1710: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1720: 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  A open page cach
1730: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
1740: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1750: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
1760: 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  ** Pager.errCode
1770: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53   may be set to S
1780: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
1790: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a  ITE_CORRUPT, or.
17a0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  ** or SQLITE_FUL
17b0: 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74  L. Once one of t
17c0: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65  he first three e
17d0: 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74  rrors occurs, it
17e0: 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64   persists.** and
17f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
1800: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76  the result of ev
1810: 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20  ery major pager 
1820: 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a  API call.  The.*
1830: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65  * SQLITE_FULL re
1840: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
1850: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
1860: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
1870: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e  y until the.** n
1880: 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72  ext successful r
1890: 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f  ollback is perfo
18a0: 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  rmed on the page
18b0: 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a  r cache. Also,.*
18c0: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f  * SQLITE_FULL do
18d0: 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  es not affect th
18e0: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
18f0: 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50  t() and sqlite3P
1900: 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  agerLookup().** 
1910: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
1920: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
1930: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74  cessfully..*/.st
1940: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
1950: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1960: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
1970: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
1980: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
1990: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
19a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19b0: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
19c0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
19d0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
19e0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
19f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a00: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
1a10: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
1a20: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
1a30: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1a40: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
1a50: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
1a60: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
1a70: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
1a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a90: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
1aa0: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
1ab0: 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20    u8 stmtOpen;  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ad0: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
1ae0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
1af0: 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75  l is open */.  u
1b00: 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20  8 stmtInUse;    
1b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b20: 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73  ue we are in a s
1b30: 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1b40: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  saction */.  u8 
1b50: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20  stmtAutoopen;   
1b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
1b70: 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68   stmt journal wh
1b80: 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  en main journal 
1b90: 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38  is opened*/.  u8
1ba0: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
1bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1bc0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
1bd0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
1be0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
1c10: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1c20: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
1c30: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
1c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c50: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
1c60: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
1c70: 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  L */.  u8 state;
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
1ca0: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
1cb0: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
1cc0: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
1cf0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
1d00: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
1d30: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1d40: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1d50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1d60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
1d70: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
1d80: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1d90: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61   */.  u8 dirtyCa
1da0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
1db0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1dc0: 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63  hed pages have c
1dd0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61  hanged */.  u8 a
1de0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1df0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1e00: 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  le DontRollback(
1e10: 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  ) for all pages 
1e20: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
1e50: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
1e60: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
1e70: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1e80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
1e90: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
1ea0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
1eb0: 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79   */.  u8 doNotSy
1ec0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1ed0: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68    /* Boolean. Wh
1ee0: 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74  ile true, do not
1ef0: 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
1f00: 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69   */.  u8 exclusi
1f10: 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  veMode;         
1f20: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72    /* Boolean. Tr
1f30: 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ue if locking_mo
1f40: 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f  de==EXCLUSIVE */
1f50: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .  u8 journalMod
1f60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1f70: 2a 20 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45  * On of the PAGE
1f80: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
1f90: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 64  values */.  u8 d
1fa0: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
1fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1fc0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
1fd0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1fe0: 44 62 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67  Db */.  u8 chang
1ff0: 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20  eCountDone;     
2000: 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72      /* Set after
2010: 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2020: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2030: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
2040: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
2050: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
2060: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2070: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  () */.  int errC
2080: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
2090: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
20a0: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
20b0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rrors */.  int d
20c0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
20d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20e0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
20f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
2100: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
2110: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
2120: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
2130: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
2140: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
2150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2160: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2170: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
2180: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
2190: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
21c0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
21d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
21e0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
21f0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
2200: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
2210: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
2220: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
2230: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
2240: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2250: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
2260: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
2270: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2290: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
22a0: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
22b0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
22c0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
22f0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
2300: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
2310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2320: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
2330: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
2340: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2370: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2380: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2390: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
23c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
23d0: 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  base */.  Bitvec
23e0: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
23f0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2400: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2410: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2420: 69 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ile */.  Bitvec 
2430: 2a 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *pInStmt;       
2440: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2450: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2460: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2470: 0a 20 20 42 69 74 76 65 63 20 2a 70 41 6c 77 61  .  Bitvec *pAlwa
2480: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 2f  ysRollback;    /
2490: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
24a0: 63 68 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  ch page marked a
24b0: 6c 77 61 79 73 2d 72 6f 6c 6c 62 61 63 6b 20 2a  lways-rollback *
24c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
24d0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
24e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
24f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2500: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
2510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2520: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
2530: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
2540: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
2550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2560: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
2570: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
2580: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c  l files */.  sql
2590: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a  ite3_file *fd, *
25a0: 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65  jfd;     /* File
25b0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
25c0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
25d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74  urnal */.  sqlit
25e0: 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20  e3_file *stfd;  
25f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2600: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
2610: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2620: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
2630: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
2640: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
2650: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
2660: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 36 34  Handler */.  i64
2670: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2690: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
26a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
26b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
26c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
26d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
26e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
26f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
2700: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
2710: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
2720: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
2730: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
2740: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
2750: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
2760: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2770: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
2780: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
2790: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34  started */.  i64
27a0: 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20   stmtJSize;     
27b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73   of journal at s
27d0: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
27e0: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2800: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
2810: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
2820: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
2830: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
2840: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
2850: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
2860: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
2870: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
2880: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
2890: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
28a0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
28b0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
28c0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
28d0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
28e0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
28f0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
2900: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
2910: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
2920: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
2930: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
2940: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
2950: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
2960: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
2970: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
2980: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2990: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
29a0: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
29b0: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
29c0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
29d0: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
29e0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
29f0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
2a00: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2a10: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
2a20: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
2a30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
2a40: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36 34 20  hanges */.  i64 
2a50: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2a60: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
2a70: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
2a80: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
2a90: 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  es */.  PCache *
2aa0: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
2ab0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2ac0: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
2ad0: 65 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ect */.};../*.**
2ae0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
2af0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
2b00: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
2b10: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
2b20: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
2b30: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
2b40: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
2b50: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
2b60: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
2b70: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
2b80: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
2b90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ba0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2bb0: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
2bc0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
2bd0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
2be0: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
2bf0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
2c00: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2c10: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
2c20: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
2c30: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
2c40: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
2c50: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2c60: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
2c70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2c80: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
2c90: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
2ca0: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
2cb0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2cc0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
2cd0: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
2cf0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
2d00: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
2d10: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
2d20: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
2d30: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
2d40: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
2d50: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
2d60: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
2d70: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
2d80: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
2d90: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
2da0: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
2db0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
2dc0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
2dd0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
2de0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
2df0: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
2e00: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
2e10: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
2e20: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
2e30: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
2e40: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
2e50: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
2e60: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
2e70: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
2e80: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
2e90: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
2ea0: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
2eb0: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
2ec0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
2ed0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
2ee0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
2ef0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
2f00: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2f10: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
2f20: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
2f30: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
2f40: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
2f50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
2f60: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
2f70: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
2f80: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
2f90: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
2fa0: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
2fb0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
2fc0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
2fd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
2fe0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
2ff0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
3000: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
3010: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3020: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3030: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3040: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3050: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3060: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3070: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3080: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3090: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
30a0: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
30b0: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
30c0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
30d0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
30e0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
30f0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
3100: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
3110: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3120: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3130: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3140: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
3150: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3160: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3170: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3180: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3190: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
31a0: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
31b0: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
31c0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
31d0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
31e0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
31f0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
3200: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
3210: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3220: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3230: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3240: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
3250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3260: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3270: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3280: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3290: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
32a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
32b0: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
32c0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
32d0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
32e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
32f0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3300: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3310: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3320: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3330: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3340: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3350: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3360: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3370: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3380: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3390: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
33a0: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
33b0: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
33c0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
33d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
33e0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
33f0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3400: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3410: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3420: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3430: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3440: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3450: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3460: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3470: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3480: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3490: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
34a0: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
34b0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
34c0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
34d0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
34e0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
34f0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3500: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3510: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3520: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3530: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3540: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3550: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3560: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
3570: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
3580: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
3590: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
35a0: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
35b0: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
35c0: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
35d0: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
35e0: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
35f0: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
3600: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
3610: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
3620: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3630: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
3640: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
3650: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
3660: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
3670: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
3680: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
3690: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
36a0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
36b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
36c0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
36d0: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
36e0: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
36f0: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
3700: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
3710: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
3720: 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f  NO(x) ((PENDING_
3730: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
3740: 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  ize))+1)../*.** 
3750: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  The maximum lega
3760: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  l page number is
3770: 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a   (2^31 - 1)..*/.
3780: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41  #define PAGER_MA
3790: 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34  X_PGNO 214748364
37a0: 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  7../*.** Return 
37b0: 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50  true if page *pP
37c0: 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
37d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
37e0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a  e statement.** j
37f0: 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65  ournal (or state
3800: 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61  ment snapshot ha
3810: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  s been created, 
3820: 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a  if *pPg is part.
3830: 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ** of an in-memo
3840: 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  ry database)..*/
3850: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3860: 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64  InStatement(PgHd
3870: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
3880: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
3890: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45  pPager;.  if( ME
38a0: 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MDB ){.    retur
38b0: 6e 20 70 50 67 2d 3e 61 70 53 61 76 65 5b 31 5d  n pPg->apSave[1]
38c0: 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
38d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
38e0: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
38f0: 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
3900: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
3910: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
3920: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
3930: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
3940: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
3950: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
3960: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
3970: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
3980: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
3990: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
39a0: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
39b0: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
39c0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
39d0: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
39e0: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
39f0: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
3a00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
3a10: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
3a20: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
3a30: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
3a40: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
3a50: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
3a60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
3a70: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
3a80: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
3a90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3aa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
3ab0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
3ac0: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
3ad0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3ae0: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
3af0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
3b00: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
3b10: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
3b20: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
3b30: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
3b40: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
3b50: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a  te((u8*)A,B)../*
3b60: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
3b70: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
3b80: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
3b90: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
3ba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
3bb0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
3bc0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
3bd0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3be0: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
3bf0: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
3c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
3c10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
3c20: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
3c30: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
3c40: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
3c50: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
3c60: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
3c70: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
3c80: 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f  If file pFd is o
3c90: 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  pen, call sqlite
3ca0: 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69  3OsUnlock() on i
3cb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
3cc0: 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65   osUnlock(sqlite
3cd0: 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74  3_file *pFd, int
3ce0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21   eLock){.  if( !
3cf0: 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  pFd->pMethods ){
3d00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3d10: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
3d20: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
3d30: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
3d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
3d50: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
3d60: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
3d70: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
3d80: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
3d90: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
3da0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
3db0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
3dc0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
3dd0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
3de0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
3df0: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
3e00: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
3e10: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
3e20: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
3e30: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
3e40: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
3e50: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
3e60: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
3e70: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
3e80: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
3e90: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
3ea0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
3eb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
3ec0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
3ed0: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
3ee0: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
3ef0: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
3f00: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
3f10: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
3f20: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
3f30: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
3f40: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
3f50: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
3f60: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
3f70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3f80: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
3f90: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
3fa0: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
3fb0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
3fc0: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
3fd0: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
3fe0: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
3ff0: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
4000: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
4010: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67 65   */.  int szPage
4020: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ;        /* Page
4030: 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74   size */.  sqlit
4040: 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
4050: 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28  ager->fd;..  if(
4060: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
4070: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
4080: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
4090: 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20  eristics(fd);.  
40a0: 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69    nSector = sqli
40b0: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
40c0: 66 64 29 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  fd);.    szPage 
40d0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
40e0: 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ze;.  }..  asser
40f0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
4100: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
4110: 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51  8));.  assert(SQ
4120: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
4130: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
4140: 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70  );..  if( !fd->p
4150: 4d 65 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20  Methods || .    
4160: 20 20 20 28 64 63 20 26 20 28 53 51 4c 49 54 45     (dc & (SQLITE
4170: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
4180: 7a 50 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53  zPage>>8)) && nS
4190: 65 63 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29  ector<=szPage) )
41a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55  {.    return JOU
41b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
41c0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
41d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
41e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
41f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
4200: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
4210: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
4220: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
4230: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
4240: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
4250: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
4260: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4270: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
4280: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
4290: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
42a0: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
42b0: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
42c0: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
42d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
42e0: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
42f0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
4300: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
4310: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
4320: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
4330: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
4340: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
4350: 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45  RRUPT, or SQLITE
4360: 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72  _FULL.** the err
4370: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
4380: 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65  stent. Until the
4390: 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72   persisten error
43a0: 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20   is cleared,.** 
43b0: 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63  subsequent API c
43c0: 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67  alls on this Pag
43d0: 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
43e0: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
43f0: 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  ame .** error co
4400: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73  de..**.** A pers
4410: 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64  istent error ind
4420: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
4430: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4440: 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
4450: 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
4460: 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
4470: 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
4480: 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
4490: 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
44a0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
44b0: 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
44c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
44d0: 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
44e0: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
44f0: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65  ror occured, the
4500: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
4510: 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
4520: 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
4530: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
4540: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
4550: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73  ager *pPager);.s
4560: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
4570: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
4580: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
4590: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
45a0: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  xff;.  assert(. 
45b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
45c0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
45d0: 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
45e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
45f0: 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
4600: 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
4610: 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
4620: 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
4630: 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c  if(.    rc2==SQL
4640: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
4650: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
4660: 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  R ||.    rc2==SQ
4670: 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29  LITE_CORRUPT.  )
4680: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
4690: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
46a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
46b0: 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
46c0: 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
46d0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
46e0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
46f0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
4700: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
4710: 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f   is already unlo
4720: 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72  cked, call pager
4730: 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f  _unlock() now to
4740: 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20  .      ** clear 
4750: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
4760: 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20  and ensure that 
4770: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
4780: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  is .      ** com
4790: 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20  pletely empty.. 
47a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61       */.      pa
47b0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
47c0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
47d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
47e0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
47f0: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
4800: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
4810: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
4820: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
4830: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
4840: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
4850: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
4860: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
4870: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
4880: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
4890: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
48a0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
48b0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
48c0: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
48d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
48e0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
48f0: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
4900: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
4910: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
4920: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
4930: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
4940: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
4950: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
4960: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
4970: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
4980: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
4990: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
49a0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
49b0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
49c0: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
49d0: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
49e0: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
49f0: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ta);.}.static u3
4a00: 32 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  2 pager_set_page
4a10: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4a20: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
4a30: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
4a40: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
4a60: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
4a70: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
4a80: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
4a90: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
4aa0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
4ab0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
4ac0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
4ad0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
4ae0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
4af0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
4b00: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
4b10: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
4b20: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
4b30: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
4b40: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
4b50: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
4b60: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
4b70: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
4b80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
4b90: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
4ba0: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
4bb0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
4bc0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44  >errCode || MEMD
4bd0: 42 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  B .      || (pPg
4be0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
4bf0: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
4c00: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
4c10: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
4c20: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
4c30: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
4c40: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
4c50: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
4c60: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
4c70: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
4c80: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
4c90: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
4ca0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
4cb0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
4cc0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
4cd0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
4ce0: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
4cf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
4d00: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
4d10: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
4d20: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
4d30: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
4d40: 79 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68  y supplied by th
4d50: 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a  e caller. .**.**
4d60: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
4d70: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
4d80: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
4d90: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
4da0: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
4db0: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
4dc0: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
4dd0: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
4de0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
4df0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
4e00: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
4e10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
4e20: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
4e30: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
4e40: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
4e50: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
4e60: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
4e70: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
4e80: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
4e90: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
4ea0: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
4eb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
4ec0: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
4ed0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
4ee0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
4ef0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
4f00: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
4f10: 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  t zMaster[0] is 
4f20: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
4f30: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
4f40: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
4f50: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
4f60: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
4f70: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
4f80: 4d 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73  Master, int nMas
4f90: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
4fa0: 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34    u32 len;.  i64
4fb0: 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75   szJ;.  u32 cksu
4fc0: 6d 3b 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  m;.  u32 u;     
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4fe0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
4ff0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
5000: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
5010: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
5020: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
5030: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
5040: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
5050: 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ';..  rc = sqlit
5060: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
5070: 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  nl, &szJ);.  if(
5080: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
5090: 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72  | szJ<16 ) retur
50a0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
50b0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
50c0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20  szJ-16, &len);. 
50d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
50e0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
50f0: 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73  .  if( len>=nMas
5100: 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ter ){.    retur
5110: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
5120: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
5130: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
5140: 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  2, &cksum);.  if
5150: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5160: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5170: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5180: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
5190: 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69  , 8, szJ-8);.  i
51a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
51b0: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
51c0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
51d0: 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63  , 8) ) return rc
51e0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
51f0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
5200: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
5210: 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20  -16-len);.  if( 
5220: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5230: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
5240: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
5250: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a  n] = '\0';..  /*
5260: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
5270: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
5280: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5290: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
52a0: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
52b0: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
52c0: 73 74 65 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20  ster[u];.   }.  
52d0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
52e0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
52f0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
5300: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
5310: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
5320: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
5330: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
5340: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5350: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
5360: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
5370: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
5380: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
5390: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
53a0: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
53b0: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
53c0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
53d0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
53e0: 20 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d      zMaster[0] =
53f0: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
5400: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5410: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
5420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5430: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5440: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
5450: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
5460: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5470: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5480: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5490: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
54a0: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
54b0: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
54c0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
54d0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
54e0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
54f0: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
5500: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
5510: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
5560: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5580: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
55a0: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
55c0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
55d0: 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e  c void seekJourn
55e0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
55f0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
5600: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
5610: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5620: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
5630: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
5640: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
5650: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
5660: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
5670: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
5680: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
5690: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
56a0: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
56b0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
56c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
56d0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
56e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
56f0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
5700: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
5710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
5720: 20 7a 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20   zeros over the 
5730: 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
5740: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
5750: 73 20 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66  s has the.** eff
5760: 65 63 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74  ect of invalidat
5770: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
5780: 66 69 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74  file and committ
5790: 69 6e 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  ing the.** trans
57a0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
57b0: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
57c0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
57d0: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
57e0: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
57f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61  SQLITE_OK;.  sta
5800: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
5810: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
5820: 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
5830: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
5840: 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20     i64 iLimit = 
5850: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
5860: 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49  izeLimit;..    I
5870: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
5880: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
5890: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
58a0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
58b0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
58c0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
58d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
58e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
58f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5900: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
5910: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
5920: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
5930: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
5940: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5950: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
5960: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
5970: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
5980: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
5990: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
59a0: 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
59b0: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
59c0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
59d0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
59e0: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
59f0: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
5a00: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
5a10: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
5a20: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
5a30: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
5a40: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
5a50: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
5a60: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
5a70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5a80: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
5a90: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
5aa0: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
5ab0: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
5ac0: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
5ad0: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
5ae0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
5af0: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
5b00: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
5b10: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
5b20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b30: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
5b40: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
5b50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5b60: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
5b70: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
5b80: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
5b90: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
5ba0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
5bb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
5bc0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
5bd0: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
5be0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5bf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5c00: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5c10: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
5c20: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
5c30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
5c40: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
5c50: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
5c60: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
5c70: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
5c80: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
5c90: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
5ca0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
5cb0: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
5cc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
5cd0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
5ce0: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
5cf0: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
5d00: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
5d10: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
5d20: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
5d30: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
5d40: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
5d50: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
5d60: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
5d70: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
5d80: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
5d90: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
5da0: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
5db0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
5dc0: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
5dd0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
5de0: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
5df0: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
5e00: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
5e10: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
5e20: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
5e30: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
5e40: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
5e50: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
5e60: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
5e70: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
5e80: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
5e90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
5ea0: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
5eb0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
5ec0: 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 20 3d  .  int nHeader =
5ed0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
5ee0: 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 3b  e;.  int nWrite;
5ef0: 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e  ..  if( nHeader>
5f00: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5f10: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48  Pager) ){.    nH
5f20: 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f  eader = JOURNAL_
5f30: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
5f40: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
5f50: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
5f60: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
5f70: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
5f80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5f90: 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72  .  }..  seekJour
5fa0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
5fb0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5fc0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
5fd0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65  ournalOff;..  me
5fe0: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
5ff0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6000: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6010: 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  c));..  /* .  **
6020: 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
6030: 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62  Field - the numb
6040: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
6050: 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74  ds that follow t
6060: 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  his.  ** journal
6070: 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c   header. Normall
6080: 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74  y, zero is writt
6090: 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  en to this value
60a0: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20   at this time.. 
60b0: 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65   ** After the re
60c0: 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20  cords are added 
60d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28  to the journal (
60e0: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
60f0: 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66  synced, .  ** if
6100: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
6110: 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73  de), the zero is
6120: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
6130: 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65  h the true numbe
6140: 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64  r.  ** of record
6150: 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e  s (see syncJourn
6160: 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  al())..  **.  **
6170: 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e   A faster altern
6180: 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74  ative is to writ
6190: 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20  e 0xFFFFFFFF to 
61a0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20  the nRec field. 
61b0: 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e  When.  ** readin
61c0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  g the journal th
61d0: 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53  is value tells S
61e0: 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20  QLite to assume 
61f0: 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65  that the.  ** re
6200: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
6210: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
6220: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
6230: 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74  ds. This assumpt
6240: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67  ion.  ** is dang
6250: 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66  erous, as if a f
6260: 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77  ailure occured w
6270: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
6280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
6290: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
62a0: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
62b0: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
62c0: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
62d0: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
62e0: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
62f0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
6300: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
6310: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
6320: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
6330: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
6340: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
6350: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
6360: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
6370: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
6380: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
6390: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
63a0: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
63b0: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
63c0: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
63d0: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
63e0: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
63f0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
6400: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
6410: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
6420: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20  ager->noSync);. 
6430: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f   if( (pPager->no
6440: 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73 71  Sync) .   || (sq
6450: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
6460: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
6470: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
6480: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
6490: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74  D) .  ){.    put
64a0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
64b0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
64c0: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
64d0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
64e0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
64f0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6500: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b  rnalMagic)], 0);
6510: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
6520: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
6530: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
6540: 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
6550: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
6560: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
6570: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
6580: 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74  nit);.  put32bit
6590: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
65a0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
65b0: 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  +4], pPager->cks
65c0: 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68  umInit);.  /* Th
65d0: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
65e0: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  se size */.  put
65f0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6600: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6610: 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72  agic)+8], pPager
6620: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  ->dbSize);.  /* 
6630: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
6640: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
6650: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
6660: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6670: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6680: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
6690: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
66a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
66b0: 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29 7b 0a  ournalHdr==0 ){.
66c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
66d0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75 74 33  size */.    put3
66e0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
66f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6700: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
6710: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
6720: 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30  ..  for(nWrite=0
6730: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
6740: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
6750: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
6760: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
6770: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
6780: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
6790: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
67a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
67b0: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
67c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
67d0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
67e0: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
67f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6800: 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Off);.    pPager
6810: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
6820: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
6830: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6840: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6850: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
6860: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
6870: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
6880: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
6890: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
68a0: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
68b0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
68c0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
68d0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
68e0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
68f0: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
6900: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
6910: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
6920: 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   of.** the journ
6930: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
6940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
6950: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
6960: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65  ccessfully, *nRe
6970: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
6980: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
6990: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
69a0: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
69b0: 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73  and *dbSize is s
69c0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
69d0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
69e0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
69f0: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
6a00: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
6a10: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6a20: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
6a30: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
6a40: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
6a50: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
6a60: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
6a70: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
6a80: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
6a90: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
6aa0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
6ab0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
6ac0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
6ad0: 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64  ed and *nRec and
6ae0: 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74   *dbSize are not
6af0: 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41   set.  If JOURNA
6b00: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
6b10: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
6b20: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6b30: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
6b40: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6b60: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
6b70: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
6b80: 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53   .  i64 journalS
6b90: 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65  ize,.  u32 *pNRe
6ba0: 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69  c, .  u32 *pDbSi
6bb0: 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ze.){.  int rc;.
6bc0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6bd0: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
6be0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
6bf0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
6c00: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66  */.  i64 jrnlOff
6c10: 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53 69 7a  ;.  int iPageSiz
6c20: 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61  e;..  seekJourna
6c30: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6c40: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
6c50: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
6c60: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
6c70: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
6c80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6c90: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e  _DONE;.  }.  jrn
6ca0: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
6cb0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63  ournalOff;..  rc
6cc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
6cd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
6ce0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6cf0: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
6d00: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6d10: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
6d20: 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  += sizeof(aMagic
6d30: 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  );..  if( memcmp
6d40: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6d50: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6d60: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
6d70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6d80: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
6d90: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6da0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
6db0: 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  f, pNRec);.  if(
6dc0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6dd0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6de0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
6df0: 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61   jrnlOff+4, &pPa
6e00: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
6e10: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6e20: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
6e30: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6e40: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38  ->jfd, jrnlOff+8
6e50: 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66  , pDbSize);.  if
6e60: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6e70: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
6e80: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6e90: 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 28 75  , jrnlOff+16, (u
6ea0: 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a 65 29  32 *)&iPageSize)
6eb0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6ec0: 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 50 61  TE_OK .   && iPa
6ed0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20 20 20  geSize>=512 .   
6ee0: 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d 53 51  && iPageSize<=SQ
6ef0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
6f00: 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50 61 67  ZE .   && ((iPag
6f10: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
6f20: 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20  ze)==0 .  ){.   
6f30: 20 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d 20   u16 pagesize = 
6f40: 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  iPageSize;.    r
6f50: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
6f60: 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
6f70: 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b 0a  er, &pagesize);.
6f80: 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 72    }.  if( rc ) r
6f90: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
6fa0: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
6fb0: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
6fc0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
6fd0: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
6fe0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
6ff0: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
7000: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
7010: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
7020: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
7030: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
7040: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
7050: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
7060: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
7070: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
7080: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
7090: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
70a0: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
70b0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
70c0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
70d0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
70e0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
70f0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
7100: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20  fd, jrnlOff+12, 
7110: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
7120: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
7130: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7140: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
7150: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
7160: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7170: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
7180: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
7190: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
71a0: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
71b0: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
71c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
71d0: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
71e0: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
71f0: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
7200: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7210: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
7220: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
7230: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
7240: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
7250: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
7260: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
7270: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
7280: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
7290: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
72a0: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
72b0: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
72c0: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
72d0: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
72e0: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
72f0: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
7300: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
7310: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
7320: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
7330: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
7340: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
7350: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
7360: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
7370: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
7380: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
7390: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
73a0: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
73b0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
73c0: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
73d0: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
73e0: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
73f0: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
7400: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
7410: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
7420: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
7430: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
7440: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
7450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
7460: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
7470: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
7490: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
74a0: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
74b0: 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c  t i; .  i64 jrnl
74c0: 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53  Off;.  i64 jrnlS
74d0: 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ize;.  u32 cksum
74e0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
74f0: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
7500: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
7510: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
7520: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
7530: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
7540: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
7550: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
7560: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
7570: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
7580: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
7590: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
75a0: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
75b0: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
75c0: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
75d0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
75e0: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
75f0: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
7600: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7610: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
7620: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
7630: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
7640: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
7650: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
7660: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
7670: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
7680: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
7690: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
76a0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a  pPager);.  }.  j
76b0: 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
76c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
76d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
76e0: 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a  f += (len+20);..
76f0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
7700: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7710: 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d  jrnlOff, PAGER_M
7720: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
7730: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7740: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7750: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34  ;.  jrnlOff += 4
7760: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7770: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7780: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
7790: 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  en, jrnlOff);.  
77a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
77b0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
77c0: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b   jrnlOff += len;
77d0: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
77e0: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
77f0: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7800: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
7810: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
7820: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
7830: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
7840: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7850: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
7860: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
7870: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7880: 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  c), jrnlOff);.  
7890: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a  jrnlOff += 8+siz
78a0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
78b0: 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  c);.  pPager->ne
78c0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
78d0: 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20  ->noSync;..  /* 
78e0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
78f0: 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75  in peristent-jou
7900: 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20  rnal mode, then 
7910: 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20  the physical .  
7920: 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ** journal-file 
7930: 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20  may extend past 
7940: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
7950: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
7960: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79  me.  ** and 8 by
7970: 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74  tes of magic dat
7980: 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74  a just written t
7990: 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  o the file. This
79a0: 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72   is .  ** danger
79b0: 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ous because the 
79c0: 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  code to rollback
79d0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
79e0: 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ile.  ** will no
79f0: 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e  t be able to fin
7a00: 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  d the master-jou
7a10: 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74  rnal name to det
7a20: 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
7a30: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
7a40: 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20  journal is hot. 
7a50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65  .  **.  ** Easie
7a60: 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69  st thing to do i
7a70: 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
7a80: 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  is to truncate t
7a90: 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
7aa0: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71   file to the req
7ab0: 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f  uired size..  */
7ac0: 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c   .  if( (rc==SQL
7ad0: 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72  ITE_OK).   && (r
7ae0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
7af0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
7b00: 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d  d, &jrnlSize))==
7b10: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
7b20: 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66  jrnlSize>jrnlOff
7b30: 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
7b40: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
7b50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
7b60: 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65  nlOff);.  }.  re
7b70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7b80: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
7b90: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
7ba0: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
7bb0: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
7bc0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
7bd0: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
7be0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
7bf0: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
7c00: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
7c10: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
7c20: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
7c30: 70 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  p;.  sqlite3Pcac
7c40: 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
7c50: 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
7c60: 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  , &p);.  return 
7c70: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  p;.}../*.** Clea
7c80: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
7c90: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
7ca0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7cb0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7cc0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7cd0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
7ce0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
7cf0: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
7d00: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
7d10: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
7d20: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
7d30: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7d40: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
7d50: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
7d60: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
7d70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7d80: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
7d90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
7da0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
7db0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
7dc0: 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
7dd0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
7de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
7df0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7e00: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
7e10: 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65  e pager is curre
7e20: 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74  ntly in error st
7e30: 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65  ate, discard the
7e40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a   contents of .**
7e50: 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
7e60: 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73  eset the Pager s
7e70: 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61  tructure interna
7e80: 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72  l state. If ther
7e90: 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20  e is.** an open 
7ea0: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68  journal-file, th
7eb0: 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  en the next time
7ec0: 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69   a shared-lock i
7ed0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e  s obtained.** on
7ee0: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
7ef0: 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20  (by this or any 
7f00: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20  other process), 
7f10: 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72  it will be.** tr
7f20: 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a  eated as a hot-j
7f30: 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
7f40: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
7f50: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
7f60: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
7f70: 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r){.  if( !pPage
7f80: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
7f90: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   ){.    if( !MEM
7fa0: 44 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  DB ){.      int 
7fb0: 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  rc = osUnlock(pP
7fc0: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
7fd0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
7fe0: 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   ) pPager->errCo
7ff0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70  de = rc;.      p
8000: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
8010: 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  -1;.      IOTRAC
8020: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
8030: 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
8040: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
8050: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
8060: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
8070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
8080: 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68  ck..      ** Oth
8090: 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20  erwise, another 
80a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
80b0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
80c0: 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20  ete might.      
80d0: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ** delete the fi
80e0: 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  le out from unde
80f0: 72 20 75 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  r us..      */. 
8100: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
8110: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
8120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
8130: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
8140: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  fd);.        pPa
8150: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8160: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
8170: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
8180: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
8190: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
81a0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
81b0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
81c0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
81d0: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c  troy(pPager->pAl
81e0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20  waysRollback);. 
81f0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
8200: 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  AlwaysRollback =
8210: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
8220: 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65     /* If Pager.e
8230: 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74  rrCode is set, t
8240: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
8250: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63  he pager cache c
8260: 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 20 20 2a  annot be.      *
8270: 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74  * trusted. Now t
8280: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 66 69  hat the pager fi
8290: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
82a0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
82b0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
82c0: 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72  he can be discar
82d0: 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ded and the erro
82e0: 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c  r code safely cl
82f0: 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
8300: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
8310: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
8320: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
8330: 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65 72 2d  ITE_OK ) pPager-
8340: 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
8350: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 70 61  E_OK;.        pa
8360: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
8370: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
8380: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8390: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
83a0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
83b0: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 20  er->stfd);.     
83c0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
83d0: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
83e0: 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->pInStmt);.    
83f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49        pPager->pI
8400: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
8410: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
8420: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
8430: 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
8440: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
8450: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
8460: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
8470: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
8480: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
8490: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
84a0: 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
84b0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
84c0: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
84d0: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ze = 0;.      }.
84e0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
84f0: 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d  MEMDB || pPager-
8500: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
8510: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
8520: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
8530: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
8540: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
8550: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
8560: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8570: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
8580: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
8590: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
85a0: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
85b0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
85c0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
85d0: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
85e0: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
85f0: 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74  e, .** do not at
8600: 74 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c 62 61  tempt the rollba
8610: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
8620: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
8630: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
8640: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72  *p){.  if( p->er
8650: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
8660: 20 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41   && p->state>=PA
8670: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
8680: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
8690: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
86a0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
86b0: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20  Rollback(p);.   
86c0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
86d0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
86e0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29   pager_unlock(p)
86f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8700: 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
8710: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74  ransaction.  A t
8720: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
8730: 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a  ded by either.**
8740: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
8750: 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57  OLLBACK..**.** W
8760: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
8770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
8780: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
8790: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
87a0: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
87b0: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
87c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
87d0: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
87e0: 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a  ne will release.
87f0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
8800: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
8810: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  s a SHARED lock 
8820: 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20  in its place if 
8830: 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61  that is.** the a
8840: 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67  ppropriate thing
8850: 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65   to do.  Release
8860: 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69   locks usually i
8870: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a  s appropriate,.*
8880: 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20  * unless we are 
8890: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
88a0: 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65  ess mode or unle
88b0: 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a  ss this is a .**
88c0: 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49   COMMIT AND BEGI
88d0: 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e  N or ROLLBACK AN
88e0: 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f  D BEGIN operatio
88f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  n..**.** The jou
8900: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74  rnal file is eit
8910: 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74  her deleted or t
8920: 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  runcated..**.** 
8930: 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b  TODO: Consider k
8940: 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eeping the journ
8950: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72  al file open for
8960: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
8970: 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69  ases..** This mi
8980: 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
8990: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
89a0: 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68  nt on windows wh
89b0: 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61  ere opening.** a
89c0: 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65   file is an expe
89d0: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e  nsive operation.
89e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
89f0: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
8a00: 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
8a10: 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
8a20: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
8a30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
8a40: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
8a50: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
8a60: 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
8a70: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
8a80: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
8a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8aa0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
8ab0: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
8ac0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8ad0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26  ger->stmtOpen &&
8ae0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
8af0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73  iveMode ){.    s
8b00: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
8b10: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
8b20: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
8b30: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
8b40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8b50: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  Open ){.    if( 
8b60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
8b70: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8b80: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
8b90: 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20           && (rc 
8ba0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
8bb0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
8bc0: 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   0))==SQLITE_OK 
8bd0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
8be0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
8bf0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8c00: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
8c10: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
8c20: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
8c30: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
8c40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
8c50: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8c60: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
8c70: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
8c80: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
8c90: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
8ca0: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
8cb0: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
8cc0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
8cd0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
8ce0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8cf0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
8d00: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
8d10: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8d20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
8d30: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
8d40: 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20  DE_DELETE || rc 
8d50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8d60: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
8d70: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
8d80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8d90: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
8da0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8db0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
8dc0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
8dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
8de0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
8df0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8e00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
8e10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
8e20: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
8e30: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
8e40: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
8e50: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8e60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
8e70: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
8e80: 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b  AlwaysRollback);
8e90: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
8ea0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
8eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
8ec0: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
8ed0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 23 69  er->pPCache);.#i
8ee0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
8ef0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69  K_PAGES.    sqli
8f00: 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
8f10: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
8f20: 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
8f30: 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  hash);.#endif.  
8f40: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
8f50: 6c 65 61 72 46 6c 61 67 73 28 70 50 61 67 65 72  learFlags(pPager
8f60: 2d 3e 70 50 43 61 63 68 65 2c 0a 20 20 20 20 20  ->pPCache,.     
8f70: 20 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e    PGHDR_IN_JOURN
8f80: 41 4c 20 7c 20 50 47 48 44 52 5f 4e 45 45 44 5f  AL | PGHDR_NEED_
8f90: 53 59 4e 43 0a 20 20 20 20 29 3b 0a 20 20 20 20  SYNC.    );.    
8fa0: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8fb0: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
8fc0: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
8fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8fe0: 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
8ff0: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a  urnal==0 );.  }.
9000: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
9010: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
9020: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
9030: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
9040: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
9050: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
9060: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
9070: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
9080: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
9090: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
90a0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
90b0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
90c0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
90d0: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
90e0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
90f0: 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
9100: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
9110: 20 2f 2a 20 6c 72 75 4c 69 73 74 53 65 74 46 69   /* lruListSetFi
9120: 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
9130: 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  ); */.  pPager->
9140: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
9150: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
9160: 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  d = 0;..  return
9170: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
9180: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
9190: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
91a0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
91b0: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
91c0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
91d0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
91e0: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
91f0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
9200: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
9210: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
9220: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
9230: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
9240: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
9250: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
9260: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
9270: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
9280: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
9290: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
92a0: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
92b0: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
92c0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
92d0: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
92e0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
92f0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
9300: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
9310: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
9320: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
9330: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
9340: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
9350: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
9360: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
9370: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
9380: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
9390: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
93a0: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
93b0: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
93c0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
93d0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
93e0: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
93f0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
9400: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
9410: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
9420: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
9430: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
9440: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
9450: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
9460: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
9470: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
9480: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
9490: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
94a0: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
94b0: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
94c0: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
94d0: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
94e0: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
94f0: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
9500: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
9510: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
9520: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
9530: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
9540: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
9550: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
9560: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
9570: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
9580: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
9590: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
95a0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
95b0: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
95c0: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
95d0: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
95e0: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
95f0: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
9600: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9610: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
9620: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
9630: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
9640: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
9650: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
9660: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
9670: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
9680: 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
9690: 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a  an(PgHdr*);../*.
96a0: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
96b0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
96c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
96d0: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
96e0: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
96f0: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
9700: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
9710: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67   isMainJrnl flag
9720: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73   is true if this
9730: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   is the main rol
9740: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
9750: 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74  d.** false for t
9760: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
9770: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20  rnal.  The main 
9780: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
9790: 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75   uses.** checksu
97a0: 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
97b0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
97c0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
97d0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
97e0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
97f0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
9800: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
9810: 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
9820: 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  k */.  sqlite3_f
9830: 69 6c 65 20 2a 6a 66 64 2c 20 20 20 2f 2a 20 54  ile *jfd,   /* T
9840: 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
9850: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  the journal bein
9860: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  g rolled back */
9870: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c 20 20  .  i64 offset,  
9880: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9890: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 77 69  t of the page wi
98a0: 74 68 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  thin the journal
98b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
98c0: 4a 72 6e 6c 20 20 20 20 20 20 20 2f 2a 20 54 72  Jrnl       /* Tr
98d0: 75 65 20 66 6f 72 20 6d 61 69 6e 20 72 6f 6c 6c  ue for main roll
98e0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 46 61  back journal. Fa
98f0: 6c 73 65 20 66 6f 72 20 53 74 6d 74 20 6a 72 6e  lse for Stmt jrn
9900: 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  l */.){.  int rc
9910: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
9940: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
9950: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
9960: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
9970: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
9980: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
9990: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
99a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
99d0: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
99e0: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  cking */.  u8 *a
99f0: 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61  Data = (u8 *)pPa
9a00: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
9a10: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
9a20: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
9a30: 0a 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c  .  /* isMainJrnl
9a40: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
9a50: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
9a60: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
9a70: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
9a80: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
9a90: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
9aa0: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
9ab0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9ac0: 6a 66 64 20 3d 3d 20 28 69 73 4d 61 69 6e 4a 72  jfd == (isMainJr
9ad0: 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
9ae0: 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29   : pPager->stfd)
9af0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44   );.  assert( aD
9b00: 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72  ata );..  rc = r
9b10: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f  ead32bits(jfd, o
9b20: 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
9b30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9b40: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9b50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9b60: 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c  Read(jfd, aData,
9b70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9b80: 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
9b90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9ba0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
9bb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9bc0: 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
9bd0: 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20  ageSize + 4;..  
9be0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
9bf0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
9c00: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
9c10: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
9c20: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
9c30: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
9c40: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
9c50: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
9c60: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
9c70: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
9c80: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
9c90: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
9ca0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
9cb0: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
9cc0: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
9cd0: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
9ce0: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
9cf0: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
9d00: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
9d10: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
9d20: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
9d30: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
9d40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9d50: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
9d60: 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70  pgno>(unsigned)p
9d70: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
9d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9d90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
9da0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
9db0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
9dc0: 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70  ts(jfd, offset+p
9dd0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
9de0: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
9df0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9e00: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
9e10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
9e20: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
9e30: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61  ksum(pPager, aDa
9e40: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
9e50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9e60: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
9e70: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
9e80: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
9e90: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
9ea0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
9eb0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
9ec0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
9ed0: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
9ee0: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
9ef0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
9f00: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
9f10: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
9f20: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
9f30: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
9f40: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
9f50: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
9f60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
9f70: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
9f80: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
9f90: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
9fa0: 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
9fb0: 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
9fc0: 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
9fd0: 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
9fe0: 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
9ff0: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
a000: 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
a010: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
a020: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
a030: 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
a040: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
a050: 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
a060: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
a070: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
a080: 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
a090: 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
a0a0: 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
a0b0: 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
a0c0: 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
a0d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
a0e0: 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
a0f0: 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
a100: 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
a110: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
a120: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
a130: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
a140: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
a150: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
a160: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
a170: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
a180: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
a190: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
a1a0: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
a1b0: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
a1c0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
a1d0: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
a1e0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
a1f0: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
a200: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
a210: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
a220: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
a230: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
a240: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
a250: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
a260: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
a270: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
a280: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
a290: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
a2a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
a2b0: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
a2c0: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
a2d0: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
a2e0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
a2f0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
a300: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
a310: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
a320: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
a330: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
a340: 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
a350: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
a360: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
a370: 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
a380: 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
a390: 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
a3a0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
a3b0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
a3c0: 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
a3d0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
a3e0: 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
a3f0: 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
a400: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
a410: 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
a420: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
a430: 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
a440: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
a450: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
a460: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
a470: 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
a480: 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
a490: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
a4a0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
a4b0: 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
a4c0: 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
a4d0: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
a4e0: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
a4f0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
a500: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
a510: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
a520: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
a530: 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
a540: 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
a550: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
a560: 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
a570: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
a580: 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
a590: 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
a5a0: 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
a5b0: 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
a5c0: 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
a5d0: 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
a5e0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
a5f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
a600: 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
a610: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ned..  */.  pPg 
a620: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
a630: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
a640: 50 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41  PAGERTRACE4("PLA
a650: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
a660: 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
a680: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
a690: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
a6a0: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
a6b0: 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a  eSize, aData));.
a6c0: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73    if( (pPager->s
a6d0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
a6e0: 55 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50  USIVE).   && (pP
a6f0: 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
a700: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
a710: 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 28  D_SYNC)).   && (
a720: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
a730: 68 6f 64 73 29 0a 20 20 29 7b 0a 20 20 20 20 69  hods).  ){.    i
a740: 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
a750: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
a760: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
a770: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
a780: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
a790: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
a7a0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
a7b0: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
a7c0: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
a7d0: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
a7e0: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
a7f0: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
a800: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
a810: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
a820: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
a830: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
a840: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
a850: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
a860: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
a870: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
a880: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
a890: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
a8a0: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
a8b0: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
a8c0: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
a8d0: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
a8e0: 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
a8f0: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
a900: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
a910: 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
a920: 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
a930: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
a940: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
a950: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
a960: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
a970: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
a980: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
a990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a9a0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 20 6d 61 6b  isMainJrnl ) mak
a9b0: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66  eClean(pPg);.#if
a9c0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
a9d0: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
a9e0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
a9f0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
aa00: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
aa10: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
aa20: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
aa30: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
aa40: 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
aa50: 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
aa60: 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
aa70: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
aa80: 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
aa90: 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
aaa0: 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
aab0: 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
aac0: 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
aad0: 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
aae0: 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
aaf0: 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
ab00: 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
ab10: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
ab20: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
ab30: 6f 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  o, 3);.    sqlit
ab40: 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
ab50: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
ab60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ab70: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
ab80: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
ab90: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
aba0: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
abb0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
abc0: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
abd0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
abe0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
abf0: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
ac00: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
ac10: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
ac20: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
ac30: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
ac40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
ac50: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
ac60: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
ac70: 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
ac80: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
ac90: 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
aca0: 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
acb0: 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
acc0: 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
acd0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
ace0: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  .**.**.** The ma
acf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ad00: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
ad10: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
ad20: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
ad30: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
ad40: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
ad50: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
ad60: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
ad70: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
ad80: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
ad90: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
ada0: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
adb0: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
adc0: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
add0: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
ade0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
adf0: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
ae00: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ae10: 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
ae20: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
ae30: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
ae40: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
ae50: 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
ae60: 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  s;.  int rc;.  i
ae70: 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  nt master_open =
ae80: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   0;.  sqlite3_fi
ae90: 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73  le *pMaster;.  s
aea0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
aeb0: 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  urnal;.  char *z
aec0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
aed0: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
aee0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
aef0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
af00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
af10: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
af20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
af30: 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65  ile */..  /* Ope
af40: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
af50: 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73  rnal file exclus
af60: 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f  ively in case so
af70: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
af80: 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67  .  ** is running
af90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
afa0: 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20  so. Not that it 
afb0: 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64  makes too much d
afc0: 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
afd0: 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
afe0: 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
aff0: 74 65 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e  te3Malloc(pVfs->
b000: 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
b010: 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
b020: 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
b030: 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
b040: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
b050: 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
b060: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
b070: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
b080: 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
b090: 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
b0a0: 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
b0b0: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
b0c0: 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
b0d0: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
b0e0: 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
b0f0: 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
b100: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
b110: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
b120: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
b130: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
b140: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
b150: 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
b160: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
b170: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
b180: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b190: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
b1a0: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
b1b0: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
b1c0: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
b1d0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
b1e0: 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
b1f0: 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 50 61  nMasterPtr = pPa
b200: 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
b210: 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a  hname+1;..    /*
b220: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
b230: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b240: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
b250: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
b260: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
b270: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
b280: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
b290: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
b2a0: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
b2b0: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
b2c0: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
b2d0: 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
b2e0: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28  terPtr);.    if(
b2f0: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
b300: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
b310: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b320: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
b330: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
b340: 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
b350: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
b360: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20  asterJournal];. 
b370: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b380: 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
b390: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
b3a0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
b3b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
b3c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b3d0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
b3e0: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a      zJournal = z
b3f0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
b400: 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72     while( (zJour
b410: 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
b420: 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
b430: 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  al ){.      int 
b440: 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63  exists;.      rc
b450: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
b460: 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
b470: 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
b480: 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
b490: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
b4a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b4b0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
b4c0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
b4d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73  }.      if( exis
b4e0: 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ts ){.        /*
b4f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
b500: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
b510: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
b520: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
b530: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
b540: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
b550: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
b560: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
b570: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
b580: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
b590: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
b5a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b5b0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
b5c0: 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
b5d0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
b5e0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
b5f0: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
b600: 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
b610: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
b620: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
b630: 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
b640: 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
b650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
b660: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b670: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
b680: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
b690: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
b6a0: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
b6b0: 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
b6c0: 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
b6d0: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
b6e0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
b6f0: 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
b700: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b710: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b720: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
b730: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
b740: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
b750: 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
b760: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
b770: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
b780: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
b790: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
b7a0: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
b7b0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
b7c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b7d0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
b7e0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
b7f0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
b800: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b810: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
b820: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
b830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
b840: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
b850: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
b860: 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
b870: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
b880: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
b890: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b8a0: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
b8b0: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
b8c0: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
b8d0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
b8e0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
b8f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
b900: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
b910: 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
b920: 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
b930: 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
b940: 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a  *pPager);../*.**
b950: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
b960: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
b970: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
b980: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
b990: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20  s.** indicated. 
b9a0: 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68  Also truncate th
b9b0: 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65  e cached represe
b9c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
b9d0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74  ile..**.** Might
b9e0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
b9f0: 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
ba00: 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
ba10: 6c 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a  ler than nPage..
ba20: 2a 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ** This can happ
ba30: 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
ba40: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68   if we are in th
ba50: 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72  e middle of a tr
ba60: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69  ansaction.** whi
ba70: 63 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20  ch has extended 
ba80: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e  the file size an
ba90: 64 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  d the new pages 
baa0: 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65  are still all he
bab0: 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20  ld.** in cache, 
bac0: 74 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f  then an INSERT o
bad0: 72 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20  r UPDATE does a 
bae0: 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
baf0: 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65  ck.  Some.** ope
bb00: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
bb10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
bb20: 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
bb30: 66 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20  f you try to.** 
bb40: 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
bb50: 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
bb60: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
bb70: 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73   it currently is
bb80: 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74  ,.** so detect t
bb90: 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
bba0: 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
bbb0: 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64   byte to the end
bbc0: 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66   of the new.** f
bbd0: 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ile instead..*/.
bbe0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bbf0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
bc00: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
bc10: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
bc20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
bc30: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
bc40: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
bc50: 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
bc60: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
bc70: 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
bc80: 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  newSize;.    rc 
bc90: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
bca0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
bcb0: 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
bcc0: 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61     newSize = pPa
bcd0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
bce0: 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
bcf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bd00: 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d  && currentSize!=
bd10: 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
bd20: 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65   if( currentSize
bd30: 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  >newSize ){.    
bd40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bd50: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
bd60: 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b  r->fd, newSize);
bd70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bd80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
bd90: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
bda0: 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77  ->fd, "", 1, new
bdb0: 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d  Size-1);.      }
bdc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
bdd0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
bde0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
bdf0: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
be00: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
be10: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
be20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
be30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
be40: 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72  e sectorSize for
be50: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
be60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74  ..**.** The sect
be70: 6f 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65  or size is at le
be80: 61 73 74 20 61 73 20 62 69 67 20 61 73 20 74 68  ast as big as th
be90: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65  e sector size re
bea0: 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  ported.** by sql
beb0: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
bec0: 28 29 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d  ().  The minimum
bed0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
bee0: 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
bef0: 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
bf00: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
bf10: 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  {.  assert(pPage
bf20: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
bf30: 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
bf40: 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
bf50: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
bf60: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
bf70: 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
bf80: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
bf90: 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
bfa0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
bfb0: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
bfc0: 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63  ened yet, in whc
bfd0: 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ih case the OsSe
bfe0: 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
bff0: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
c000: 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
c010: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
c020: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
c030: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
c040: 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
c050: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
c060: 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70  ize<512 ){.    p
c070: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c080: 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a  e = 512;.  }.}..
c090: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
c0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
c0b0: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
c0c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
c0d0: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
c0e0: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
c0f0: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
c100: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
c110: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
c120: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
c130: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
c140: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
c150: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
c160: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
c170: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
c180: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
c190: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
c1a0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
c1b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
c1c0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
c1d0: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
c1e0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
c1f0: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
c200: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
c210: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
c220: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
c230: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
c240: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
c250: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
c260: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
c270: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
c280: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
c290: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
c2a0: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
c2b0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
c2c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
c2d0: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
c2e0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
c2f0: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
c300: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
c310: 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  5)  4 byte big-e
c320: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
c330: 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f  ich is the secto
c340: 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61  r size.  The hea
c350: 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20  der.**       is 
c360: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
c370: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29  in size..**  (6)
c380: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
c390: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
c3a0: 68 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61  h is the page ca
c3b0: 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62  se..**  (7)  4 b
c3c0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
c3d0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
c3e0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
c3f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
c400: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
c410: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
c420: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
c430: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
c440: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
c450: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38  journal.).**  (8
c460: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
c470: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c480: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
c490: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
c4a0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
c4b0: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
c4c0: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
c4d0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
c4e0: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
c4f0: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
c500: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
c510: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
c520: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
c530: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
c540: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
c550: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
c560: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
c570: 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  9)  Zero or more
c580: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
c590: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
c5a0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
c5b0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
c5c0: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
c5d0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
c5e0: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
c5f0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
c600: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
c610: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
c620: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
c630: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
c640: 20 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65   the first 8 ite
c650: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
c660: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
c670: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
c680: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68  tance of the 9th
c690: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
c6a0: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
c6b0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
c6c0: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
c6d0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c6e0: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
c6f0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
c700: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
c710: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
c720: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
c730: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
c740: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
c750: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
c760: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
c770: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
c780: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
c790: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
c7a0: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
c7b0: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
c7c0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
c7d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c7e0: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
c7f0: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
c800: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
c810: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
c820: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
c830: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
c840: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
c850: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
c860: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
c870: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
c880: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
c890: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
c8a0: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
c8b0: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
c8c0: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
c8d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
c8e0: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
c8f0: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
c900: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
c910: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
c920: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
c930: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
c940: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
c950: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
c960: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
c970: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
c980: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
c990: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
c9a0: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
c9b0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
c9c0: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
c9d0: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
c9e0: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
c9f0: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
ca00: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
ca10: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
ca20: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
ca30: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
ca40: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
ca50: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
ca60: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
ca70: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
ca80: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
ca90: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
caa0: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
cab0: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
cac0: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
cad0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
cae0: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
caf0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
cb00: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
cb10: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
cb20: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
cb30: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
cb40: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
cb50: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
cb60: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
cb70: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
cb80: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
cb90: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
cba0: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
cbb0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
cbc0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
cbd0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
cbe0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
cbf0: 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
cc00: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
cc10: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
cc20: 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
cc30: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
cc40: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
cc50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
cc60: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
cc70: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
cc80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cc90: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
cca0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
ccb0: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
ccc0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
ccd0: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
cce0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
ccf0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
cd00: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
cd10: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
cd20: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
cd30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd40: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
cd50: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
cd60: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
cd70: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
cd80: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
cd90: 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
cda0: 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
cdb0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
cdc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
cdd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cde0: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
cdf0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
ce00: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
ce10: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
ce20: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
ce30: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
ce40: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
ce50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
ce60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
ce70: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
ce80: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
ce90: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
cea0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ceb0: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20  TE_OK || szJ==0 
cec0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
ced0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
cee0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
cef0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
cf00: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
cf10: 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
cf20: 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
cf30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cf40: 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
cf50: 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
cf60: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
cf70: 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
cf80: 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
cf90: 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
cfa0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
cfb0: 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
cfc0: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  back..  */.  zMa
cfd0: 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
cfe0: 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
cff0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
d000: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
d010: 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
d020: 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
d030: 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
d040: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
d050: 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
d060: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
d070: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
d080: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
d090: 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
d0a0: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
d0b0: 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
d0c0: 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
d0d0: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
d0e0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
d0f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d100: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
d110: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
d120: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
d130: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
d140: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
d150: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
d160: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
d170: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
d180: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
d190: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
d1a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
d1b0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
d1c0: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
d1d0: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
d1e0: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
d1f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
d200: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
d210: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
d220: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
d230: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
d240: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
d250: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
d260: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
d270: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
d280: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
d290: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
d2a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
d2b0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
d2c0: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
d2d0: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
d2e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d2f0: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
d300: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
d310: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d320: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d330: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
d340: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
d350: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
d360: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
d370: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
d380: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
d390: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
d3a0: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
d3b0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
d3c0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
d3d0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
d3e0: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
d3f0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
d400: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
d410: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
d420: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
d430: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
d440: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
d450: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
d460: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d470: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
d480: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
d490: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
d4a0: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
d4b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d4c0: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
d4d0: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
d4e0: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
d4f0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
d500: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
d510: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
d520: 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
d530: 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
d540: 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
d550: 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
d560: 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
d570: 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
d580: 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
d590: 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
d5a0: 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
d5b0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
d5c0: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
d5d0: 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
d5e0: 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
d5f0: 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
d600: 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
d610: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
d620: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
d630: 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
d640: 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
d650: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
d660: 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
d670: 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
d680: 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
d690: 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a  t #2565..    */.
d6a0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
d6b0: 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
d6c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
d6d0: 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
d6e0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d6f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d700: 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
d710: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
d720: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
d730: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
d740: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
d750: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
d760: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
d770: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
d780: 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
d790: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
d7a0: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
d7b0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d7c0: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
d7d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
d7e0: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
d7f0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
d800: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
d810: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
d820: 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
d830: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d840: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
d850: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
d860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
d870: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
d880: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
d890: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
d8a0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
d8b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
d8c0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
d8d0: 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
d8f0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
d900: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
d910: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
d920: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
d930: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d940: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d950: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d960: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
d970: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
d980: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
d990: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d9a0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
d9b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d9c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d9d0: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
d9e0: 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
d9f0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ck, then the dat
da00: 61 62 61 73 65 20 69 73 20 70 72 6f 62 61 62 6c  abase is probabl
da10: 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67  y.          ** g
da20: 6f 69 6e 67 20 74 6f 20 65 6e 64 20 75 70 20 62  oing to end up b
da30: 65 69 6e 67 20 63 6f 72 72 75 70 74 2e 20 20 49  eing corrupt.  I
da40: 74 20 69 73 20 63 6f 72 72 75 70 74 20 74 6f 20  t is corrupt to 
da50: 75 73 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20  us, anyhow..    
da60: 20 20 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73        ** Perhaps
da70: 20 74 68 65 20 6e 65 78 74 20 70 72 6f 63 65 73   the next proces
da80: 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
da90: 63 61 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20  can fix it..... 
daa0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
dab0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
dac0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
dad0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
dae0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
daf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
db00: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
db10: 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
db20: 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
db30: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
db40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
db50: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
db60: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
db70: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
db80: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
db90: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
dba0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
dbb0: 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
dbc0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
dbd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
dbe0: 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
dbf0: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
dc00: 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
dc10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
dc20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
dc30: 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
dc40: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
dc50: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
dc60: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
dc70: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
dc80: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
dc90: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
dca0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
dcb0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
dcc0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
dcd0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
dce0: 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
dcf0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a   zMaster);.  }..
dd00: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
dd10: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
dd20: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
dd30: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
dd40: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
dd50: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
dd60: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
dd70: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
dd80: 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
dd90: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
dda0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
ddb0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
ddc0: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
ddd0: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
dde0: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
ddf0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
de00: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
de10: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
de20: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
de30: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
de40: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
de50: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
de60: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
de70: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
de80: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
de90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
dea0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
deb0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
dec0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
ded0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
dee0: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
def0: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
df00: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
df10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
df20: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
df30: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
df40: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
df50: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
df60: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
df70: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
df80: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
df90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
dfa0: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
dfb0: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
dfc0: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
dfd0: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
dfe0: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
dff0: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
e000: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
e010: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
e020: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
e030: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
e040: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
e050: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
e060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e070: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
e080: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0a0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e0b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
e0c0: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
e0d0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65  nalOff;..  /* Se
e0e0: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
e0f0: 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61  he offset just a
e100: 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
e110: 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
e120: 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74  .  ** page writt
e130: 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  en before the fi
e140: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
e150: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
e160: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
e170: 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74  action was writt
e180: 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  en, or the end o
e190: 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
e1a0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
e1b0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
e1c0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
e1d0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
e1e0: 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
e1f0: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
e200: 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
e210: 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
e220: 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
e230: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
e240: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
e250: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
e260: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
e270: 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
e280: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
e290: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
e2a0: 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
e2b0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
e2c0: 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
e2d0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
e2e0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
e2f0: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
e300: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
e310: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
e320: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
e330: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
e340: 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20  lOpen );.  nRec 
e350: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
e360: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
e370: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
e380: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
e390: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
e3a0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
e3b0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
e3c0: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
e3d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
e3e0: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
e3f0: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
e400: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
e410: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
e420: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
e430: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
e440: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
e450: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
e460: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
e470: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
e480: 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e   = i*(4+pPager->
e490: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
e4a0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
e4b0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
e4c0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
e4d0: 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  , offset, 0);.  
e4e0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
e4f0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
e500: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e510: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
e520: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
e530: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
e540: 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
e550: 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
e560: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
e570: 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
e580: 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
e590: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e5a0: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
e5b0: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
e5c0: 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
e5d0: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
e5e0: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
e5f0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
e600: 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
e610: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
e620: 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
e630: 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
e640: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
e650: 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
e660: 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
e670: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
e680: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
e690: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
e6a0: 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
e6b0: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
e6c0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
e6d0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
e6e0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
e6f0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
e700: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
e710: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
e720: 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
e730: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e740: 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
e750: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e760: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e770: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e780: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
e790: 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
e7a0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
e7b0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
e7c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e7d0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
e7e0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
e7f0: 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
e800: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
e810: 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
e820: 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
e830: 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
e840: 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
e850: 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
e860: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
e870: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
e880: 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
e890: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
e8a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e8b0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
e8c0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
e8d0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
e8e0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
e8f0: 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
e900: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
e910: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
e920: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
e930: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
e940: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
e950: 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
e960: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
e970: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
e980: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
e990: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
e9a0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
e9b0: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
e9c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e9d0: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  f, 1);.      ass
e9e0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
e9f0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
ea00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ea10: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
ea20: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
ea30: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
ea40: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
ea50: 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
ea60: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
ea70: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
ea80: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
ea90: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
eaa0: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
eab0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
eac0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
ead0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
eae0: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
eaf0: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
eb00: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
eb10: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
eb20: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
eb30: 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
eb40: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
eb50: 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
eb60: 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
eb70: 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
eb80: 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
eb90: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
eba0: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
ebb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
ebc0: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
ebd0: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
ebe0: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
ebf0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
ec00: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
ec10: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
ec20: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
ec30: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
ec40: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
ec50: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
ec60: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
ec70: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
ec80: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
ec90: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
eca0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
ecb0: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
ecc0: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
ecd0: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
ece0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
ecf0: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
ed00: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
ed10: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ed20: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
ed30: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
ed40: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
ed50: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
ed60: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
ed70: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
ed80: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
ed90: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
edb0: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
edc0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
edd0: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
ede0: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
edf0: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
ee00: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
ee10: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
ee20: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
ee30: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
ee40: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
ee50: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
ee60: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
ee70: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
ee80: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
ee90: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
eeb0: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
eec0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
eed0: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
eee0: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
eef0: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
ef00: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
ef10: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
ef20: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
ef30: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
ef40: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
ef50: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
ef60: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
ef70: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
ef80: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
ef90: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
efa0: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
efc0: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
efd0: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
efe0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
eff0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
f000: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
f010: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
f020: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
f030: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
f040: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
f050: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
f060: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
f070: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
f080: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
f090: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
f0a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
f0b0: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
f0c0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
f0d0: 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
f0e0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
f0f0: 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
f100: 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
f110: 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
f120: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
f130: 70 46 69 6c 65 20 7c 7c 20 4d 45 4d 44 42 3b 0a  pFile || MEMDB;.
f140: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
f150: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
f160: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
f170: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  le;.  pPager->sy
f180: 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c  nc_flags = (bFul
f190: 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  lFsync?SQLITE_SY
f1a0: 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
f1b0: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69  YNC_NORMAL);.  i
f1c0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
f1d0: 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
f1e0: 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
f1f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
f200: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
f210: 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
f220: 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
f230: 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
f240: 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
f250: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
f260: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
f270: 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
f280: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
f290: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
f2a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
f2b0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
f2c0: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
f2d0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
f2e0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
f2f0: 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rary file. .**.*
f300: 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
f310: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
f320: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
f330: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
f340: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
f350: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
f360: 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
f370: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
f380: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
f390: 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
f3a0: 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
f3b0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
f3c0: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
f3d0: 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
f3e0: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f3f0: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
f400: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
f410: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
f420: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
f430: 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
f440: 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
f450: 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
f460: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
f470: 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
f480: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
f490: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f4a0: 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
f4b0: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
f4c0: 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
f4d0: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
f4e0: 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
f4f0: 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
f500: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
f510: 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
f520: 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
f530: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f540: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
f550: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
f560: 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
f570: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
f580: 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
f590: 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
f5a0: 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
f5b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f5c0: 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  || pFile->pMetho
f5d0: 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ds );.  return r
f5e0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
f5f0: 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
f600: 64 20 2a 2c 50 67 48 64 72 20 2a 29 3b 0a 0a 2f  d *,PgHdr *);../
f610: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
f620: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
f630: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
f640: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
f650: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
f660: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
f670: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
f680: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
f690: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
f6a0: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
f6b0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
f6c0: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
f6d0: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
f6e0: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
f6f0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
f700: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
f710: 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a  e3PagerUnref()..
f720: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
f730: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
f740: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
f750: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
f760: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
f770: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
f780: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
f790: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
f7a0: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
f7b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
f7c0: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
f7d0: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
f7e0: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
f7f0: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
f800: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
f810: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
f820: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
f830: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
f840: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
f850: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
f860: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
f870: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
f880: 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
f890: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
f8a0: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
f8b0: 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
f8c0: 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
f8d0: 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
f8e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
f8f0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
f900: 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
f910: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
f920: 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
f930: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
f940: 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
f950: 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
f960: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
f970: 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
f980: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
f990: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
f9a0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
f9b0: 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
f9c0: 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
f9d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
f9e0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
f9f0: 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
fa00: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
fa10: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
fa20: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
fa30: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
fa40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
fa50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
fa60: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
fa70: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
fa80: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
fa90: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
faa0: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
fab0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
fac0: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
fad0: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
fae0: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
faf0: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
fb00: 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  !=0;.  int journ
fb10: 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c  alFileSize = sql
fb20: 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
fb30: 70 56 66 73 29 3b 0a 20 20 69 6e 74 20 70 63 61  pVfs);.  int pca
fb40: 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
fb50: 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 0a 20  3PcacheSize();. 
fb60: 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74 20   int szPageDflt 
fb70: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
fb80: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68  _PAGE_SIZE;.  ch
fb90: 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
fba0: 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  0;.  int nPathna
fbb0: 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  me = 0;..  /* Th
fbc0: 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e  e default return
fbd0: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
fbe0: 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  er */.  *ppPager
fbf0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
fc00: 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
fc10: 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
fc20: 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
fc30: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
fc40: 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
fc50: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
fc60: 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
fc70: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
fc80: 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
fc90: 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
fca0: 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
fcb0: 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
fcc0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
fcd0: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
fce0: 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  {.    nPathname 
fcf0: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
fd00: 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
fd10: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
fd20: 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
fd30: 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
fd40: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
fd50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
fd60: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
fd70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
fd80: 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
fd90: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
fda0: 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
fdb0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
fdc0: 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
fdd0: 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
fde0: 20 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 30    useJournal = 0
fdf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
fe00: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  if.    {.      r
fe10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
fe20: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
fe30: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
fe40: 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
fe50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fe60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
fe70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
fe80: 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
fe90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fea0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 74 68  .    }.    nPath
feb0: 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50  name = strlen(zP
fec0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  athname);.  }.. 
fed0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
fee0: 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65  ory for the page
fef0: 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
ff00: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
ff10: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
ff20: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
ff30: 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
ff40: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
ff50: 2a 2f 0a 20 20 20 20 70 63 61 63 68 65 53 69 7a  */.    pcacheSiz
ff60: 65 20 20 20 20 20 20 2b 20 20 20 20 20 20 20 20  e      +        
ff70: 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
ff80: 65 63 74 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ect */.    journ
ff90: 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20  alFileSize +    
ffa0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
ffb0: 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63  urnal file struc
ffc0: 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66  ture */ .    pVf
ffd0: 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 33 20  s->szOsFile * 3 
ffe0: 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  +        /* The 
fff0: 6d 61 69 6e 20 64 62 20 61 6e 64 20 74 77 6f 20  main db and two 
10000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
10010 20 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d   .    3*nPathnam
10020 65 20 2b 20 34 30 20 20 20 20 20 20 20 20 20 20  e + 40          
10030 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20    /* zFilename, 
10040 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75  zDirectory, zJou
10050 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  rnal */.  );.  i
10060 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20  f( !pPager ){.  
10070 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10080 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
10090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
100a0 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
100b0 2d 3e 70 50 43 61 63 68 65 20 3d 20 28 50 43 61  ->pPCache = (PCa
100c0 63 68 65 20 2a 29 26 70 50 61 67 65 72 5b 31 5d  che *)&pPager[1]
100d0 3b 0a 20 20 70 50 74 72 20 3d 20 28 28 75 38 20  ;.  pPtr = ((u8 
100e0 2a 29 26 70 50 61 67 65 72 5b 31 5d 29 20 2b 20  *)&pPager[1]) + 
100f0 70 63 61 63 68 65 53 69 7a 65 3b 0a 20 20 70 50  pcacheSize;.  pP
10100 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
10110 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61   vfsFlags;.  pPa
10120 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74  ger->fd = (sqlit
10130 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
10140 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d  Vfs->szOsFile*0]
10150 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64  ;.  pPager->stfd
10160 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
10170 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
10180 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61  OsFile*1];.  pPa
10190 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69  ger->jfd = (sqli
101a0 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
101b0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32  pVfs->szOsFile*2
101c0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  ];.  pPager->zFi
101d0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
101e0 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
101f0 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69  File*2+journalFi
10200 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
10210 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20  r->zDirectory = 
10220 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
10230 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  me[nPathname+1];
10240 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
10250 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
10260 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e  Directory[nPathn
10270 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ame+1];.  pPager
10280 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
10290 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
102a0 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  {.    memcpy(pPa
102b0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
102c0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
102d0 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73 71 6c  name+1);.    sql
102e0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
102f0 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ame);.  }..  /* 
10300 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
10310 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
10320 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
10330 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
10340 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  mDb ){.    if( n
10350 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e  Pathname>(pVfs->
10360 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a  mxPathname - siz
10370 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29  eof("-journal"))
10380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
10390 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
103a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
103b0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
103c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
103d0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
103e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
103f0 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20   pPager->fd,.   
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66        pPager->vf
10420 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
10430 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d        readOnly =
10440 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
10450 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
10460 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
10470 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
10480 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
10490 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
104a0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f  s,.      ** choo
104b0 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
104c0 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
104d0 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
104e0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
104f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
10500 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
10510 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
10520 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  m of:.      **. 
10530 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c       **    + SQL
10540 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
10550 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20  _SIZE,.      ** 
10560 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
10570 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
10580 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
10590 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
105a0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
105b0 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
105c0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
105d0 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lly..      */.  
105e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
105f0 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
10600 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ly ){.        in
10610 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20  t iSectorSize = 
10620 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
10630 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
10640 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
10650 61 67 65 44 66 6c 74 3c 69 53 65 63 74 6f 72 53  ageDflt<iSectorS
10660 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
10670 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 53   szPageDflt = iS
10680 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
10690 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
106a0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
106b0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
106c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
106d0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
106e0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
106f0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
10700 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
10710 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
10720 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
10730 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
10740 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
10750 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
10760 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
10770 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
10780 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
10790 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
107a0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
107b0 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
107c0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
107d0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
107e0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
107f0 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
10800 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
10810 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
10820 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
10830 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
10840 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10850 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
10860 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
10870 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41 58  eDflt>SQLITE_MAX
10880 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
10890 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
108a0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
108b0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
108c0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
108d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
108e0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
108f0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a 20  memDb ){.    /* 
10900 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
10910 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
10920 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
10930 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
10940 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
10950 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
10960 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
10970 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
10980 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
10990 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
109a0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
109b0 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
109c0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
109d0 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
109e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
109f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
10a00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
10a10 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
10a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
10a30 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  r->pTmpSpace = s
10a40 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
10a50 28 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20  (szPageDflt);.  
10a60 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
10a70 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65  ror occured in e
10a80 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
10a90 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20  cks above..  ** 
10aa0 46 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73  Free the Pager s
10ab0 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
10ac0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
10ad0 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  * Since the page
10ae0 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  r is not allocat
10af0 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ed there is no n
10b00 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a  eed to set .  **
10b10 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61   any Pager.errMa
10b20 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  sk variables..  
10b30 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  */.  if( !pPager
10b40 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d   || !pPager->pTm
10b50 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pSpace ){.    sq
10b60 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
10b70 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
10b80 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
10b90 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
10ba0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
10bb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
10bc0 3b 0a 20 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d  ;.  }.  nExtra =
10bd0 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
10be0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
10bf0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
10c00 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
10c10 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
10c30 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
10c40 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
10c50 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
10c60 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
10c70 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
10c80 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
10c90 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
10ca0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
10cb0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
10cc0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
10cd0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
10ce0 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20  ilename))..  /* 
10cf0 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44  Fill in Pager.zD
10d00 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20  irectory[] */.  
10d10 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
10d20 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65  Directory, pPage
10d30 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  r->zFilename, nP
10d40 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f  athname+1);.  fo
10d50 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65  r(i=strlen(pPage
10d60 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20  r->zDirectory); 
10d70 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
10d80 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
10d90 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
10da0 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
10db0 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
10dc0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  = 0;..  /* Fill 
10dd0 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  in Pager.zJourna
10de0 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  l[] */.  if( zPa
10df0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65  thname ){.    me
10e00 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
10e10 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a  urnal, pPager->z
10e20 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
10e30 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
10e40 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
10e50 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
10e60 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20  -journal", 9);. 
10e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
10e80 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30  er->zJournal = 0
10e90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67  ;.  }..  /* pPag
10ea0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
10eb0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
10ec0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
10ed0 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
10ee0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
10ef0 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20  = noReadlock && 
10f00 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
10f10 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
10f20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
10f30 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
10f40 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
10f50 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
10f60 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
10f70 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70  e = memDb-1;.  p
10f80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10f90 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20  = szPageDflt;.  
10fa0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
10fb0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
10fc0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
10fd0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
10fe0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
10ff0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
11000 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
11010 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
11020 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
11030 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
11040 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
11050 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
11060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11070 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
11080 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
11090 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
110a0 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61  OCK) );.  /* pPa
110b0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
110c0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
110d0 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
110e0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
110f0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
11100 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
11110 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
11120 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
11130 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
11140 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
11150 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
11160 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
11170 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
11180 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65  clusiveMode = te
11190 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
111a0 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
111b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
111c0 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
111d0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
111e0 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
111f0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
11200 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
11210 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
11220 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
11230 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
11240 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
11250 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
11260 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
11270 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
11280 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
11290 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
112a0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
112b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
112c0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
112d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
112e0 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70  ra = nExtra;.  p
112f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
11300 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
11310 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
11320 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
11330 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
11340 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44  ->pMethods||memD
11350 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  b||tempFile);.  
11360 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
11370 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
11380 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f  pPager);.  }.  /
11390 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
113a0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
113b0 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
113c0 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
113d0 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
113e0 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67  h)); */.  *ppPag
113f0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
11400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11420 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
11430 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
11440 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11450 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65  Busyhandler(Page
11460 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48  r *pPager, BusyH
11470 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
11480 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  dler){.  pPager-
11490 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
114a0 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a  pBusyHandler;.}.
114b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
114c0 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
114d0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
114e0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
114f0 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
11500 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
11510 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
11520 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
11530 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11540 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
11550 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
11560 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
11570 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
11580 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
11590 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
115a0 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
115b0 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
115c0 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
115d0 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
115e0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
115f0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
11600 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
11610 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
11620 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
11630 65 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  e*)){.  pPager->
11640 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
11650 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
11660 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  t the page size 
11670 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49  to *pPageSize. I
11680 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
11690 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a  w page size is.*
116a0 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  * inappropriate,
116b0 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
116c0 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
116d0 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a  s set to that.**
116e0 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
116f0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
11700 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
11710 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
11720 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
11730 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  eSize){.  int rc
11740 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
11750 64 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  de;.  if( rc==SQ
11760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
11770 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
11780 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  PageSize;.    as
11790 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
117a0 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
117b0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
117c0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
117d0 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66  _SIZE) );.    if
117e0 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  ( pageSize && pa
117f0 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
11800 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26  pageSize .     &
11810 26 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & (pPager->memDb
11820 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
11830 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26  bSize==0).     &
11840 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
11850 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
11860 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
11870 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
11880 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
11890 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
118a0 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
118b0 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
118c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
118d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
118e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
118f0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
11900 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
11910 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
11920 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
11930 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
11940 6d 44 62 20 29 20 73 65 74 53 65 63 74 6f 72 53  mDb ) setSectorS
11950 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
11960 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
11970 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
11980 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  pSpace);.       
11990 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
119a0 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
119b0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
119c0 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
119d0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
119e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
119f0 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65      }.    *pPage
11a00 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
11a10 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72  ageSize;.  }.  r
11a20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11a30 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
11a40 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
11a50 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
11a60 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
11a70 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
11a80 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
11a90 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
11aa0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
11ab0 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
11ac0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
11ad0 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
11ae0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
11af0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
11b00 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
11b10 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
11b20 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
11b30 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
11b40 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
11b50 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
11b60 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
11b70 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
11b80 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
11b90 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
11ba0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
11bb0 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
11bc0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
11bd0 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
11be0 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
11bf0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
11c00 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
11c10 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
11c20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
11c30 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
11c40 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
11c50 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
11c60 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
11c70 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
11c80 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
11c90 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
11ca0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
11cb0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
11cc0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
11cd0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
11ce0 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
11cf0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
11d00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11d10 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
11d20 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
11d30 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
11d40 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
11d50 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
11d60 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
11d70 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
11d80 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
11d90 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
11da0 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
11db0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
11dc0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
11dd0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
11de0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
11df0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
11e00 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
11e10 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
11e20 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
11e30 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
11e40 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
11e50 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
11e60 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
11e70 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
11e80 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
11e90 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
11ea0 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
11eb0 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
11ec0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
11ed0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
11ee0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
11ef0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
11f00 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
11f10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
11f20 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
11f30 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
11f40 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
11f50 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
11f60 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
11f70 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
11f80 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
11f90 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
11fa0 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
11fb0 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
11fc0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11fd0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
11fe0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
11ff0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
12000 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
12010 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
12020 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
12030 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
12040 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
12050 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
12060 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
12070 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
12080 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
12090 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
120a0 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
120b0 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
120c0 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
120d0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
120e0 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
120f0 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
12100 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
12110 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
12120 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
12130 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
12140 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
12150 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
12160 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
12170 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
12180 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
12190 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
121a0 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
121b0 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
121c0 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
121d0 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
121e0 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
121f0 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
12200 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
12210 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
12220 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
12230 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  his)..*/.int sql
12240 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
12250 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
12260 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
12270 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
12280 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
12290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
122a0 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
122b0 3b 0a 20 20 61 73 73 65 72 74 28 4d 45 4d 44 42  ;.  assert(MEMDB
122c0 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ||pPager->fd->pM
122d0 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
122e0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
122f0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
12300 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54  thods ){.    IOT
12310 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
12320 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
12330 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
12340 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
12350 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
12360 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
12370 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
12380 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
12390 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
123a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
123b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
123c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
123d0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
123e0 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
123f0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
12400 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20  with.** pPager. 
12410 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45  .**.** If the PE
12420 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20  NDING_BYTE lies 
12430 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65  on the page dire
12440 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65  ctly after the e
12450 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  nd of the.** fil
12460 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72  e, then consider
12470 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20   this page part 
12480 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e  of the file too.
12490 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
124a0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  .** PENDING_BYTE
124b0 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74   is byte 4096 (t
124c0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
124d0 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65   page 5) and the
124e0 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
124f0 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74  file is 4096 byt
12500 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65  es, 5 is returne
12510 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a  d instead of 4..
12520 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12530 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
12540 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12550 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69 36 34 20  *pnPage){.  i64 
12560 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  n = 0;.  int rc;
12570 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12580 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
12590 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
125a0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
125b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72  ->errCode;.    r
125c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
125d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
125e0 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
125f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
12600 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
12610 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
12620 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
12630 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
12640 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
12650 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
12660 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
12670 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
12680 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
12690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
126a0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
126b0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
126c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
126d0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20    }.    if( n>0 
126e0 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67  && n<pPager->pag
126f0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e  eSize ){.      n
12700 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
12710 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67  .      n /= pPag
12720 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
12730 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
12740 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
12750 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
12760 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
12770 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = n;.    }.  }. 
12780 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47   if( n==(PENDING
12790 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
127a0 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e  geSize) ){.    n
127b0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  ++;.  }.  if( n>
127c0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
127d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
127e0 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Pgno = n;.  }.  
127f0 69 66 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20  if( pnPage ){.  
12800 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 3b 0a 20    *pnPage = n;. 
12810 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12820 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12830 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
12840 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
12850 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
12860 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ger*);../*.** Th
12870 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
12880 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  ed to truncate t
12890 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20  he cache when a 
128a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74  database.** is t
128b0 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20  runcated.  Drop 
128c0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61  from the cache a
128d0 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
128e0 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72  gno is.** larger
128f0 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
12900 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
12910 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  ferenced..**.** 
12920 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
12930 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
12940 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
12950 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63  zeroed..**.** Ac
12960 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70  tually, at the p
12970 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
12980 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
12990 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65  would be.** an e
129a0 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72  rror to have a r
129b0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20  eferenced page. 
129c0 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e   But rather than
129d0 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20   delete.** that 
129e0 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74  page and guarant
129f0 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  ee a subsequent 
12a00 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65  segfault, it see
12a10 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20  ms better.** to 
12a20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65  zero it and hope
12a30 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f   that we error o
12a40 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74  ut sanely..*/.st
12a50 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
12a60 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
12a70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12a80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
12a90 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
12aa0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
12ab0 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  dbSize);.}../*.*
12ac0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
12ad0 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
12ae0 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
12af0 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
12b00 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
12b10 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
12b20 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
12b30 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
12b40 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
12b50 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
12b60 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
12b70 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
12b80 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
12b90 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
12ba0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
12bb0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
12bc0 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
12bd0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
12be0 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
12bf0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
12c00 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
12c10 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
12c20 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
12c30 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
12c40 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
12c50 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
12c60 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
12c70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
12c80 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
12c90 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
12ca0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
12cb0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
12cc0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
12cd0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
12ce0 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
12cf0 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
12d00 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
12d10 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
12d20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12d30 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
12d40 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
12d50 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
12d60 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
12d70 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
12d80 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
12d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
12da0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
12db0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
12dc0 72 20 29 20 70 50 61 67 65 72 2d 3e 70 42 75 73  r ) pPager->pBus
12dd0 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79 20  yHandler->nBusy 
12de0 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  = 0;.    do {.  
12df0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12e00 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
12e10 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
12e20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
12e30 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
12e40 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
12e50 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
12e60 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
12e70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12e80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
12e90 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
12ea0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
12eb0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
12ec0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
12ed0 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
12ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12ef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
12f00 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
12f10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
12f20 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
12f30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12f40 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
12f50 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
12f60 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
12f70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
12f80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
12f90 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
12fa0 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 0a  D || MEMDB );...
12fb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
12fc0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
12fd0 30 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  0);.  if( pPager
12fe0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12ff0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
13000 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 20 69  rCode;.  }else i
13010 66 28 20 6e 50 61 67 65 3c 28 75 6e 73 69 67 6e  f( nPage<(unsign
13020 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
13030 65 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d  e ){.    if( MEM
13040 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
13050 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
13060 67 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  ge;.      pager_
13070 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
13080 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73  Pager);.    }els
13090 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  e{.      rc = sy
130a0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
130b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
130c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
130d0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
130e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
130f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
13100 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
13110 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
13120 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
13130 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
13140 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
13150 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13170 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
13180 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
13190 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 20  ger, nPage);.   
131a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
131b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
131c0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
131d0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
131e0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
131f0 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
13200 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
13210 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13220 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
13230 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13240 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
13250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13260 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
13270 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
13280 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
13290 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
132a0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
132b0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
132c0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
132d0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
132e0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
132f0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
13300 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
13310 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
13320 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
13330 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
13340 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
13350 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
13360 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
13370 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
13380 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
13390 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
133a0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
133b0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
133c0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
133d0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
133e0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
133f0 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
13400 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
13410 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
13420 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
13430 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
13440 29 7b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  ){..  disable_si
13450 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
13460 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
13470 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
13480 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
13490 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
134a0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
134b0 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
134c0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
134d0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
134e0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
134f0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
13500 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
13510 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
13520 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 50 41  gnMalloc();.  PA
13530 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
13540 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
13550 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
13560 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
13570 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69 66  ", pPager)).  if
13580 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13590 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
135a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
135b0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
135c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
135d0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
135e0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73 71 6c 69  Journal);.  sqli
135f0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
13600 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
13610 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 69 66 28  Rollback);.  if(
13620 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
13630 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
13640 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
13650 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  stfd);.  }.  sql
13660 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
13670 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65  er->fd);.  /* Te
13680 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
13690 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
136a0 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
136b0 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
136c0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
136d0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
136e0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
136f0 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
13700 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ..  sqlite3PageF
13710 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
13720 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
13730 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
13740 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
13750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
13760 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
13770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
13780 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
13790 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
137a0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
137b0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
137c0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
137d0 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
137e0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
137f0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
13800 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65  DbPage *p){.  re
13810 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
13820 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
13830 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
13840 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
13850 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
13860 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
13870 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
13880 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
13890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
138a0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
138b0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
138c0 63 68 65 52 65 66 28 70 50 67 29 3b 0a 20 20 72  cheRef(pPg);.  r
138d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
138e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
138f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
13900 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
13910 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
13920 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
13930 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
13940 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
13950 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
13960 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
13970 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
13980 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
13990 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
139a0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
139b0 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
139c0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
139d0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
139e0 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
139f0 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
13a00 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
13a10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13a20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
13a30 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
13a40 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
13a50 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
13a60 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
13a70 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
13a80 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
13a90 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
13aa0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
13ab0 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
13ac0 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
13ad0 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
13ae0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
13af0 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
13b00 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
13b10 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
13b20 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
13b30 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
13b40 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
13b50 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
13b60 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
13b70 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
13b80 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
13b90 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
13ba0 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
13bb0 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
13bc0 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
13bd0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
13be0 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
13bf0 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
13c00 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
13c10 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
13c20 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
13c30 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
13c40 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
13c50 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
13c60 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f  r failure, so no
13c70 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
13c80 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50  .** If the IOCAP
13c90 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67  _SEQUENTIAL flag
13ca0 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65 20   is set for the 
13cb0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
13cc0 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65   on which.** the
13cd0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
13ce0 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63  red, then OsSync
13cf0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
13d00 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
13d10 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68  l.** file. In th
13d20 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74  is case all that
13d30 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20   is required is 
13d40 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e 52  to update the nR
13d50 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74  ec field in.** t
13d60 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
13d70 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
13d80 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
13d90 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
13da0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
13db0 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
13dc0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
13dd0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
13de0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13df0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13e00 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
13e10 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
13e20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
13e30 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
13e40 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
13e50 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
13e60 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
13e70 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
13e80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
13e90 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
13ea0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
13eb0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13ec0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
13ed0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
13ee0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
13ef0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61  er->fd);.      a
13f00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13f10 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20  ournalOpen );.. 
13f20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
13f30 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
13f40 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
13f50 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
13f60 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
13f70 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
13f80 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
13f90 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
13fa0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
13fb0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
13fc0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
13fd0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
13fe0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
13ff0 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
14000 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
14010 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
14020 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
14030 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
14040 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
14050 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
14060 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
14070 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
14080 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
14090 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
140a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
140b0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
140c0 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
140d0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
140e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
140f0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
14100 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
14110 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
14120 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
14130 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
14140 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
14150 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
14160 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
14170 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
14180 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
14190 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
141a0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
141b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
141c0 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20   jrnlOff;.      
141d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
141e0 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
141f0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
14200 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
14210 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
14220 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
14230 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
14240 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
14250 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
14260 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
14270 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
14280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14290 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
142a0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
142b0 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
142c0 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
142d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
142e0 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f  }..        jrnlO
142f0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
14300 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
14310 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b  (aJournalMagic);
14320 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
14330 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
14340 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a  %d\n", pPager, j
14350 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20  rnlOff, 4));.   
14360 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
14370 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
14380 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67  d, jrnlOff, pPag
14390 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
143a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
143b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
143c0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
143d0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
143e0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
143f0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
14400 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
14410 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
14420 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
14430 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
14440 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
14450 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
14460 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
14470 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
14480 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a  r->sync_flags| .
14490 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
144a0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53  r->sync_flags==S
144b0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
144c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
144d0 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
144e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
144f0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
14500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14510 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
14520 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
14530 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
14540 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
14550 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
14560 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
14570 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
14580 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
14590 63 61 63 68 65 43 6c 65 61 72 46 6c 61 67 73 28  cacheClearFlags(
145a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
145b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
145c0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
145d0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
145e0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
145f0 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
14600 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
14610 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
14620 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
14630 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
14640 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
14650 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
14660 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
14670 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  */.  else{.    s
14680 71 6c 69 74 65 33 50 63 61 63 68 65 41 73 73 65  qlite3PcacheAsse
14690 72 74 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  rtFlags(pPager->
146a0 70 50 43 61 63 68 65 2c 20 30 2c 20 50 47 48 44  pPCache, 0, PGHD
146b0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
146c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
146d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
146e0 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
146f0 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
14700 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
14710 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
14720 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
14730 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
14740 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
14750 61 73 65 20 66 69 6c 65 2e 20 4e 6f 20 63 61 6c  ase file. No cal
14760 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a 20 74  ls are made.** t
14770 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
14780 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
14790 65 73 20 61 73 20 63 6c 65 61 6e 2e 20 49 74 20  es as clean. It 
147a0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
147b0 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20  ility.** of the 
147c0 63 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 50 63  caller to use Pc
147d0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 6f  acheCleanAll() o
147e0 72 20 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  r PcacheMakeClea
147f0 6e 28 29 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74  n() to mark.** t
14800 68 65 20 70 61 67 65 73 20 61 73 20 63 6c 65 61  he pages as clea
14810 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
14820 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
14830 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
14840 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
14850 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
14860 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14870 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14880 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
14890 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
148a0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
148b0 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
148c0 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
148d0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
148e0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
148f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
14900 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
14910 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
14920 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
14930 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
14940 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
14950 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
14960 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
14970 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
14980 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
14990 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
149a0 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
149b0 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
149c0 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
149d0 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
149e0 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
149f0 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
14a00 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
14a10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14a20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
14a30 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
14a40 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
14a50 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
14a60 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
14a70 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
14a80 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
14a90 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
14aa0 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
14ab0 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
14ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
14ad0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
14ae0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
14af0 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
14b00 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
14b10 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
14b20 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
14b30 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
14b40 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
14b50 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
14b60 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
14b70 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
14b80 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
14b90 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
14ba0 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
14bb0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
14bc0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
14bd0 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
14be0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
14bf0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
14c00 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
14c10 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
14c20 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
14c30 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
14c40 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
14c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14c60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
14c70 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
14c80 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
14c90 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
14ca0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
14cb0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
14cc0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
14cd0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
14ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
14cf0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
14d00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14d10 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
14d20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
14d30 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
14d40 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28  lags);.      if(
14d50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14d60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14d70 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
14d80 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
14d90 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
14da0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
14db0 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
14dc0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
14dd0 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
14de0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20  PagerTruncate() 
14df0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
14e00 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
14e10 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
14e20 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
14e30 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
14e40 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
14e50 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
14e60 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
14e70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
14e80 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
14e90 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
14ea0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
14eb0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
14ec0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
14ed0 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  t = (pList->pgno
14ee0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
14ef0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
14f00 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
14f10 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
14f20 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73  ist->pData, pLis
14f30 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
14f40 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
14f50 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
14f60 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
14f90 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  r), pList->pgno,
14fa0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
14fb0 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49  pList));.      I
14fc0 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
14fd0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
14fe0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a   pList->pgno));.
14ff0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15000 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
15010 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
15020 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
15030 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41  ffset);.      PA
15040 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
15050 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
15060 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47  ount);.      PAG
15070 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
15080 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
15090 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
150a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
150b0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
150c0 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
150d0 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
150e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
150f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15100 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
15110 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
15120 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54  AGERTRACE3("NOST
15130 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
15140 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
15150 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
15160 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15170 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
15180 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  rn rc;.#ifdef SQ
15190 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
151a0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
151b0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
151c0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
151d0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
151e0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
151f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
15200 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15210 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15220 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
15230 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
15240 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
15250 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
15260 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
15270 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
15280 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 75 72 67  ointer to a purg
15290 65 61 62 6c 65 20 50 61 67 65 72 20 0a 2a 2a 20  eable Pager .** 
152a0 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75 6e  object. This fun
152b0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
152c0 6f 20 6d 61 6b 65 20 61 20 73 69 6e 67 6c 65 20  o make a single 
152d0 64 69 72 74 79 20 70 61 67 65 20 74 68 61 74 20  dirty page that 
152e0 68 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74 73 74 61  has no.** outsta
152f0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
15300 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29   (if one exists)
15310 20 63 6c 65 61 6e 20 73 6f 20 74 68 61 74 20 69   clean so that i
15320 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
15330 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 70 63 61  d .** by the pca
15340 63 68 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  che layer..*/.st
15350 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
15360 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
15370 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
15380 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
15390 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
153a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
153b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
153c0 4e 6f 74 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  NotSync ){.    r
153d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
153e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
153f0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
15400 5f 44 49 52 54 59 20 29 3b 0a 20 20 69 66 28 20  _DIRTY );.  if( 
15410 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
15420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15430 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
15440 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
15450 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
15460 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
15470 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
15480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
15490 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
154a0 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 73 71  && .        !(sq
154b0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
154c0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
154d0 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
154e0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
154f0 44 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  D).      ){.    
15500 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
15510 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
15520 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
15530 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
15540 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
15550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15560 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44  ){.      pPg->pD
15570 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
15580 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
15590 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
155a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
155b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
155c0 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
155d0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
155e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
155f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15600 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15610 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
15620 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15630 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
15640 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 69 73  rn 1 if there is
15650 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
15660 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
15670 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
15680 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
15690 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
156a0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
156b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
156c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
156d0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
156e0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
156f0 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
15700 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
15710 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
15720 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
15730 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
15740 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
15750 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
15760 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
15770 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
15780 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 64  e if unable to d
15790 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61  etermine the sta
157a0 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tus of the journ
157b0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  al..**.** This r
157c0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
157d0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
157e0 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
157f0 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e   its.** content.
15800 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75    Hence, the jou
15810 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
15820 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  in the name of a
15830 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
15840 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61 73  al file that has
15850 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61   been deleted, a
15860 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20  nd hence not be 
15870 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20  hot.  Or.** the 
15880 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
15890 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a  urnal might be z
158a0 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73  eroed out.  This
158b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
158c0 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68   not discover th
158d0 65 73 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e  ese cases of a n
158e0 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d  on-hot journal -
158f0 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   if the.** journ
15900 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
15910 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  nd is not empty 
15920 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  this routine ass
15930 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f  umes it.** is ho
15940 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c  t.  The pager_pl
15950 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
15960 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
15970 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  hat the.** journ
15980 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
15990 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69  eally hot and wi
159a0 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ll no-op..*/.sta
159b0 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
159c0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
159d0 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
159e0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
159f0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
15a00 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
15a10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15a20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 69 6e  int exists;.  in
15a30 74 20 6c 6f 63 6b 65 64 3b 0a 20 20 61 73 73 65  t locked;.  asse
15a40 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
15a50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15a60 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
15a70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15a80 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
15a90 29 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  );.  *pExists = 
15aa0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
15ab0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
15ac0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
15ad0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
15ae0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
15af0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15b00 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
15b10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15b20 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
15b30 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
15b40 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d  d, &locked);.  }
15b50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15b60 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26  E_OK && exists &
15b70 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
15b80 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20   int nPage;.    
15b90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15ba0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
15bb0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
15bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15bd0 4b 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50  K ){.     if( nP
15be0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
15bf0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
15c00 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
15c10 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
15c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c30 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
15c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15c60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  }../*.** Read th
15c70 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
15c80 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
15c90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15ca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
15cb0 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a  adDbPage(Pager *
15cc0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
15cd0 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
15ce0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20    int rc;.  i64 
15cf0 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74  offset;.  assert
15d00 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
15d10 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
15d20 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
15d30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
15d40 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
15d50 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
15d60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15d70 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
15d80 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  D;.  }.  offset 
15d90 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
15da0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15db0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15dc0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
15dd0 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
15de0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
15df0 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45   offset);.  PAGE
15e00 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
15e10 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
15e20 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
15e30 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
15e40 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
15e50 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
15e60 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66  er, pgno));.  if
15e70 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
15e80 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
15e90 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
15ea0 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
15eb0 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
15ef0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
15f00 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
15f10 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
15f20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
15f30 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46    PAGERTRACE4("F
15f40 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
15f50 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
15f70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
15f80 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  Pg->pgno, pager_
15f90 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a  pagehash(pPg));.
15fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15fb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
15fc0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15fd0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61  o obtain the sha
15fe0 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65  red lock require
15ff0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61  d before.** data
16000 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f   may be read fro
16010 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
16020 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64  e. If the shared
16030 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64   lock has alread
16040 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e  y.** been obtain
16050 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
16060 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
16070 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  .** Immediately 
16080 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20  after obtaining 
16090 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
160a0 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74  (if required), t
160b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
160c0 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74  checks for a hot
160d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49  -journal file. I
160e0 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
160f0 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
16100 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66  lback.** is perf
16110 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ormed immediatel
16120 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
16130 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
16140 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16150 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16160 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45  TE_OK;.  int isE
16170 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a  rrorReset = 0;..
16180 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
16190 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
161a0 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
161b0 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74  cess, has no out
161c0 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70  standing .  ** p
161d0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61  age references a
161e0 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  nd is in an erro
161f0 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20  r-state, now is 
16200 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  the chance to cl
16210 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
16220 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
16230 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
16240 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
16250 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f  treat any.  ** o
16260 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
16270 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
16280 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d  l..  */.  if( !M
16290 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
162a0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
162b0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
162c0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
162d0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26  r->pPCache)==0 &
162e0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
162f0 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  e .  ){.    if( 
16300 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16310 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45  pen ){.      isE
16320 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
16330 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
16340 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
16350 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
16360 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
16370 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
16380 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
16390 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
163a0 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
163b0 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
163c0 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
163d0 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
163e0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
163f0 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
16400 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
16410 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
16420 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
16430 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
16440 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
16450 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
16460 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
16470 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
16480 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
16490 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
164a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
164b0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
164c0 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
164d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
164e0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
164f0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28  r->pVfs;.    if(
16500 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
16510 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61   int isHotJourna
16520 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
16530 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
16540 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
16550 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
16560 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
16570 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  >noReadlock ){. 
16580 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
16590 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
165a0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
165b0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
165c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
165d0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
165e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
165f0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
16600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
16610 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
16620 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
16640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
16650 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
16660 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  K );.      }.  .
16670 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f        /* If a jo
16680 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
16690 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
166a0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
166b0 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
166c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
166d0 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
166e0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
166f0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
16700 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
16710 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
16720 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  set ){.        r
16730 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
16740 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74  l(pPager, &isHot
16750 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
16760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16780 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
16790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
167a0 20 20 20 20 20 20 69 66 28 20 69 73 45 72 72 6f        if( isErro
167b0 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a  rReset || isHotJ
167c0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
167d0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
167e0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
167f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16800 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
16810 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
16820 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
16830 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
16840 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
16850 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
16860 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
16870 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
16880 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
16890 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
168a0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
168b0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
168c0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
168d0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
168e0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
168f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
16900 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
16910 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
16920 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
16930 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
16940 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
16950 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
16960 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
16970 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
16980 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
16990 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
169a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
169b0 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
169c0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
169d0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
169e0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
169f0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73     ** obtain its
16a00 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
16a10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16a20 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
16a30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
16a40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45   pPager->state<E
16a50 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
16a60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16a70 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
16a80 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
16a90 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
16aa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ac0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
16ad0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
16ae0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
16af0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
16b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16b10 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
16b20 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
16b30 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 0a  VE;.        }. .
16b40 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
16b50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
16b60 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
16b70 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
16b80 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a  se in .        *
16b90 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
16ba0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
16bb0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
16bc0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
16bd0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  d.        ** pos
16be0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
16bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
16c00 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
16c10 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
16c20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
16c30 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
16c40 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
16c50 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
16c60 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ires.        ** 
16c70 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
16c80 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
16c90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
16ca0 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 26   !isErrorReset &
16cb0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
16cc0 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  lOpen==0 ){.    
16cd0 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
16ce0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
16cf0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
16d00 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  fs,pPager->zJour
16d10 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53  nal,SQLITE_ACCES
16d20 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a  S_EXISTS,&res);.
16d30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
16d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16d50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
16d60 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
16d70 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
16d80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16d90 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
16da0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
16db0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
16dc0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
16dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16de0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
16df0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
16e00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
16e10 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
16e20 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
16e30 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
16e40 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
16e50 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
16e60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
16e70 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
16e80 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16e90 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49 54    if( fout&SQLIT
16ea0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
16eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16ec0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16ed0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  USY;.           
16ee0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
16ef0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
16f00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16f10 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
16f20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
16f30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
16f40 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
16f50 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
16f60 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
16f70 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ss.             
16f80 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
16f90 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a  rolled it back *
16fa0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
16fb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
16fd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
16ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
17010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
17020 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  M && rc!=SQLITE_
17030 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  IOERR_UNLOCK .  
17040 20 20 20 20 20 20 20 20 20 26 26 20 72 63 21 3d           && rc!=
17050 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
17060 45 4d 20 0a 20 20 20 20 20 20 20 20 20 20 29 7b  EM .          ){
17070 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17080 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
17090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
170a0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
170b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
170c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
170d0 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
170e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
170f0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
17100 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
17110 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17120 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
17130 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
17140 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17150 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
17160 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61   .        /* Pla
17170 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
17180 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
17190 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
171a0 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a   write.        *
171b0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
171c0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
171d0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck..        */. 
171e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
171f0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
17200 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 1);.        i
17210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
17230 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
17240 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
17250 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
17260 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
17270 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
17280 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
17290 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20  _SHARED || .    
172a0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
172b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
172c0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
172d0 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
172e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
172f0 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
17300 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
17310 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
17320 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  he)>0 ){.       
17330 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
17340 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
17350 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
17360 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
17370 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74          ** and t
17380 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
17390 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
173a0 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
173b0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ious.        ** 
173c0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
173d0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
173e0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
173f0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
17400 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
17410 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
17420 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
17430 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
17440 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65          ** cache
17450 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
17460 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
17470 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65   changes is dete
17480 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
17490 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
174a0 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nning.        **
174b0 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
174c0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
174d0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
174e0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
174f0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d          ** a 32-
17500 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
17510 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
17520 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
17530 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
17540 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
17550 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
17560 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
17570 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20  nge when.       
17580 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
17590 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a  n use..        *
175a0 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  * .        ** Th
175b0 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
175c0 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
175d0 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
175e0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
175f0 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
17600 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
17610 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
17620 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
17630 6c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  l that.        *
17640 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
17650 65 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  ected..        *
17660 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64  /.        char d
17670 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
17680 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
17690 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73  ers)];.        s
176a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
176b0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
176c0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
176d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
176e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
176f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
17700 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
17710 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
17720 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
17730 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
17740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  ){.          IOT
17750 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
17760 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
17770 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
17780 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s)));.          
17790 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
177a0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
177b0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
177c0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
177d0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  24);.          i
177e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
177f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17800 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
17810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17830 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
17840 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
17850 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
17860 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17870 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
17880 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
17890 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
178a0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
178b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
178c0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
178d0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
178e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
178f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17900 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
17910 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
17920 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
17930 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17940 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17950 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
17960 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
17970 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
17980 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
17990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
179a0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
179b0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
179c0 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
179d0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
179e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
179f0 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
17a00 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
17a10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
17a30 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65 20  ure we have the 
17a40 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61  content for a pa
17a50 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ge.  If the page
17a60 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73   was.** previous
17a70 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
17a80 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
17a90 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
17aa0 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74  was.** just init
17ab0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
17ac0 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e   instead of bein
17ad0 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  g read from disk
17ae0 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20  ..** But now we 
17af0 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64 61  need the real da
17b00 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20  ta off of disk. 
17b10 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   So make sure we
17b20 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65  .** have it.  Re
17b30 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20 64  ad it in if we d
17b40 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c  o not have it al
17b50 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ready..*/.static
17b60 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63   int pager_get_c
17b70 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50  ontent(PgHdr *pP
17b80 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  g){.  if( pPg->f
17b90 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
17ba0 52 45 41 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  READ ){.    int 
17bb0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
17bc0 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67  pPg->pPager, pPg
17bd0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
17be0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
17c00 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
17c10 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
17c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
17c30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17c40 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17c50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17c60 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
17c70 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
17c80 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74 68 65  ed zero, and the
17c90 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
17ca0 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65 20 6f   the.** middle o
17cb0 66 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  f a write transa
17cc0 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65 64 20  ction or opened 
17cd0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
17ce0 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a 2a 2f  e, unlock it..*/
17cf0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
17d00 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
17d10 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
17d20 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
17d30 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
17d40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
17d50 3d 30 29 0a 20 20 20 20 26 26 20 28 21 70 50 61  =0).    && (!pPa
17d60 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
17d70 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  de || pPager->jo
17d80 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29  urnalOff>0) .  )
17d90 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
17da0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
17db0 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
17dc0 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20 66  ** Drop a page f
17dd0 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75 73  rom the cache us
17de0 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
17df0 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eDrop()..**.** I
17e00 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65  f this means the
17e10 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61  re are now no pa
17e20 67 65 73 20 77 69 74 68 20 72 65 66 65 72 65 6e  ges with referen
17e30 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20 72  ces to them, a r
17e40 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
17e50 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
17e60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
17e70 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74  s removed..*/.st
17e80 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 44  atic void pagerD
17e90 72 6f 70 50 61 67 65 28 44 62 50 61 67 65 20 2a  ropPage(DbPage *
17ea0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
17eb0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
17ec0 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ger;.  sqlite3Pc
17ed0 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
17ee0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
17ef0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
17f00 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
17f10 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
17f20 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
17f30 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
17f40 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
17f50 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
17f60 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
17f70 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
17f80 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
17f90 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
17fa0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sed..**.** This 
17fb0 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
17fc0 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
17fd0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
17fe0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
17ff0 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
18000 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
18010 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
18020 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
18030 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
18040 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
18050 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
18060 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
18070 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
18080 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
18090 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
180a0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
180b0 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
180c0 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
180d0 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
180e0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
180f0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
18100 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
18110 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
18120 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
18130 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
18140 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
18150 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18160 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
18170 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
18180 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
18190 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
181a0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
181b0 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
181c0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
181d0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
181e0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
181f0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
18200 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
18210 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
18220 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
18230 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
18240 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
18250 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
18260 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
18270 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
18280 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
18290 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
182a0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
182b0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
182c0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
182d0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
182e0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
182f0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
18300 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
18310 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
18320 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
18330 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
18340 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
18350 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
18360 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61  is false, the pa
18370 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
18380 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
18390 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e  om disk..** If n
183a0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
183b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
183c0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
183d0 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
183e0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
183f0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73   at this time, s
18400 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69  o do not do a di
18410 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66  sk read.  Just f
18420 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  ill in the.** pa
18430 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  ge content with 
18440 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b  zeros.  But mark
18450 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77   the fact that w
18460 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20  e have not read 
18470 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62  the.** content b
18480 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  y setting the Pg
18490 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
184a0 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66  g.  Later on, if
184b0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
184c0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
184d0 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  ed on this page 
184e0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
184f0 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  ne is.** called 
18500 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e  again with noCon
18510 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tent==0, that me
18520 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ans that the con
18530 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a  tent is needed.*
18540 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72  * and the disk r
18550 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
18560 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
18570 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18580 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
18590 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
185a0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
185b0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
185c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
185d0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
185e0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
185f0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
18600 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
18610 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
18620 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
18630 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
18640 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
18650 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
18660 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
18670 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
18680 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
18690 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74   *pPg = 0;.  int
186a0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
186b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
186c0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20  AGER_UNLOCK .   
186d0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63      || sqlite3Pc
186e0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
186f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
18700 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d  .       || pgno=
18710 3d 31 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  =1 .  );..  /* T
18720 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
18730 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
18740 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
18750 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
18760 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
18770 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
18780 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
18790 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
187a0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
187b0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
187c0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
187d0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
187e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
187f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18800 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
18810 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
18820 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
18830 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
18840 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18850 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
18860 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  e = 0;..  /* If 
18870 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
18880 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
18890 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
188a0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
188b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
188c0 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
188d0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
188e0 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
188f0 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
18900 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
18910 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
18920 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
18930 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18940 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
18950 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
18960 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18970 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18980 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
18990 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
189a0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
189b0 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20  no, 1, &pPg);.  
189c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
189d0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
189e0 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
189f0 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  g->pPager==0 ){.
18a00 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
18a10 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
18a20 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
18a30 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
18a40 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
18a50 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20  nitialized..    
18a60 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
18a70 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
18a80 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
18a90 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
18aa0 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 69 66  = pPager;.    if
18ab0 28 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ( sqlite3BitvecT
18ac0 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
18ad0 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 20 29 7b  ournal, pgno) ){
18ae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
18af0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 70  MEMDB );.      p
18b00 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
18b10 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  DR_IN_JOURNAL;. 
18b20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
18b30 70 50 67 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  pPg->pExtra, 0, 
18b40 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
18b50 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
18b60 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
18b70 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
18b80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18ba0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
18bb0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
18bc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
18bd0 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
18be0 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
18bf0 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  || noContent ){.
18c00 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
18c10 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
18c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18c30 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
18c40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18c50 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
18c60 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
18c70 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
18c80 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18c90 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f  e);.      if( no
18ca0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
18cb0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
18cc0 20 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44   PGHDR_NEED_READ
18cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18ce0 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
18cf0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
18d00 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
18d10 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
18d20 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72  eadDbPage(pPager
18d30 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20  , pPg, pgno);.  
18d40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18d50 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
18d60 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
18d70 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
18d80 2f 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  /* sqlite3PagerU
18d90 6e 72 65 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20  nref(pPg); */.  
18da0 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70 50        pagerDropP
18db0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
18dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18dd0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
18de0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
18df0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
18e00 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
18e10 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
18e20 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
18e30 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
18e40 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
18e50 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
18e60 0a 20 20 20 20 61 73 73 65 72 74 28 73 71 6c 69  .    assert(sqli
18e70 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
18e80 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
18e90 65 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  e)>0 || pgno==1)
18ea0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
18eb0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
18ec0 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
18ed0 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
18ee0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
18ef0 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
18f00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
18f10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
18f20 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
18f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18f40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
18f50 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
18f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18f70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
18f80 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
18f90 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
18fa0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
18fb0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
18fc0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
18fd0 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
18fe0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18ff0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
19000 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
19010 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
19020 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
19030 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
19040 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
19050 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
19060 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
19070 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
19080 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
19090 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
190a0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
190b0 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
190c0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
190d0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
190e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
190f0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
19100 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
19110 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
19120 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
19130 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
19140 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
19150 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
19160 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
19170 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
19180 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
19190 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
191a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
191b0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69   pgno!=0 );..  i
191c0 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
191d0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29  e!=PAGER_UNLOCK)
191e0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
191f0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
19200 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  OK || pPager->er
19210 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
19220 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  LL).  ){.    sql
19230 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
19240 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
19250 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
19260 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
19270 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
19280 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
19290 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
192a0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
192b0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
192c0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
192d0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
192e0 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
192f0 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
19300 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
19310 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
19320 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
19330 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
19340 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19350 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
19360 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
19370 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
19380 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
19390 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67  ( pPg ){.    Pag
193a0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
193b0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71  ->pPager;.    sq
193c0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
193d0 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67  se(pPg);.    pag
193e0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
193f0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
19400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
19420 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
19430 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
19440 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
19450 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
19460 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
19470 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19480 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
19490 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
194a0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
194b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
194c0 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
194d0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
194e0 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
194f0 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
19500 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
19510 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
19520 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
19530 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
19540 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
19550 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
19560 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
19570 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
19580 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19590 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
195a0 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
195b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a  _OPEN_CREATE);..
195c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
195d0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
195e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
195f0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
19600 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
19610 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
19620 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
19630 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
19640 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71  urnal==0 );.  sq
19650 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
19660 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
19670 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
19680 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
19690 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
196a0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66  r->dbSize);.  if
196b0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
196c0 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
196d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
196e0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
196f0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
19700 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  l;.  }..  if( pP
19710 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
19720 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  n==0 ){.    if( 
19730 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19740 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
19750 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |= (SQLITE_OPEN_
19760 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
19770 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
19780 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 65 6c  OURNAL);.    }el
19790 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  se{.      flags 
197a0 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |= (SQLITE_OPEN_
197b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
197c0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
197d0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
197e0 5f 57 52 49 54 45 0a 20 20 20 20 72 63 20 3d 20  _WRITE.    rc = 
197f0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
19800 65 6e 28 0a 20 20 20 20 20 20 20 20 70 56 66 73  en(.        pVfs
19810 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
19820 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
19830 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
19840 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
19850 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
19860 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19870 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
19880 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
19890 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
198a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
198b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
198c0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
198d0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
198e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
198f0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
19900 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
19910 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  r = 0;.    pPage
19920 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
19930 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  0;.    if( rc!=S
19940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19960 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
19970 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
19980 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
19990 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
199a0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
199b0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
199c0 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20  journal;.    }. 
199d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
199e0 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
199f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
19a00 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50  tarted = 0;.  pP
19a10 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
19a20 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
19a30 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
19a40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
19a50 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
19a60 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67  ->errCode;.    g
19a70 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
19a80 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
19a90 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
19aa0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
19ab0 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
19ac0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
19ad0 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
19ae0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
19af0 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
19b00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
19b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
19b20 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  tBegin(pPager);.
19b30 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
19b40 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
19b50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72  QLITE_NOMEM && r
19b60 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
19b70 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20  NOMEM ){.    rc 
19b80 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
19b90 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
19ba0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
19bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19bc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
19bd0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
19be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69   return rc;..fai
19bf0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
19c00 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33 42 69  nal:.  sqlite3Bi
19c10 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
19c20 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
19c30 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
19c40 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
19c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19c60 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
19c70 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
19c80 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
19c90 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
19ca0 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
19cb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
19cc0 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
19cd0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
19ce0 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
19cf0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
19d00 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
19d10 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
19d20 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
19d30 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
19d40 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
19d50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19d60 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
19d70 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
19d80 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
19d90 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
19da0 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
19db0 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
19dc0 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
19dd0 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
19de0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
19df0 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
19e00 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
19e10 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
19e20 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
19e30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
19e40 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
19e50 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
19e60 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
19e70 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
19e80 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19e90 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
19ea0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
19eb0 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
19ec0 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
19ed0 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
19ee0 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
19ef0 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
19f00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19f10 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
19f20 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
19f30 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
19f40 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
19f50 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
19f60 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
19f70 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
19f80 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
19f90 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
19fa0 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
19fb0 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
19fc0 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
19fd0 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
19fe0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
19ff0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1a000 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
1a010 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
1a020 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
1a030 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1a040 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
1a050 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
1a060 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
1a070 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1a080 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
1a090 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
1a0a0 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
1a0b0 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
1a0c0 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
1a0d0 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
1a0e0 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
1a0f0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
1a100 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1a110 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
1a120 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
1a130 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
1a140 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1a150 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1a160 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a170 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1a180 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
1a190 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1a1a0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1a1b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1a1c0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1a1d0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
1a1e0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
1a1f0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  nal==0 );.    sq
1a200 6c 69 74 65 33 50 63 61 63 68 65 41 73 73 65 72  lite3PcacheAsser
1a210 74 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  tFlags(pPager->p
1a220 50 43 61 63 68 65 2c 20 30 2c 20 50 47 48 44 52  PCache, 0, PGHDR
1a230 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _IN_JOURNAL);.  
1a240 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1a250 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1a260 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
1a270 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
1a280 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1a290 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1a2a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a2b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a2c0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1a2d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
1a2e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1a2f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a300 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1a310 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
1a320 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
1a330 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
1a340 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1a350 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1a360 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1a370 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
1a380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a390 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a3a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1a3b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1a3c0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1a3d0 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
1a3e0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
1a3f0 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
1a400 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1a410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
1a420 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1a430 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
1a440 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  File.           
1a450 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
1a460 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1a470 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
1a480 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a490 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1a4a0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1a4b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1a4c0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
1a4d0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1a4e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1a4f0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1a500 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
1a510 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
1a520 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1a530 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
1a540 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
1a550 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
1a560 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
1a570 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
1a580 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
1a590 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
1a5a0 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
1a5b0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
1a5c0 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
1a5d0 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
1a5e0 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
1a5f0 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1a600 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
1a610 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
1a620 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
1a630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1a640 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1a650 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1a660 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
1a670 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
1a680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a690 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1a6a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1a6b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1a6c0 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67  er, 0);.    pPag
1a6d0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
1a6e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
1a6f0 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62  eate( pPager->db
1a700 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1a710 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
1a720 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1a730 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1a740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a750 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1a760 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1a770 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
1a780 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1a790 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1a7a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
1a7b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a7c0 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
1a7d0 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
1a7e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1a7f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a800 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1a810 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
1a820 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
1a830 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
1a840 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
1a850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a860 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
1a870 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
1a880 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
1a890 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
1a8a0 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61  Make a page clea
1a8b0 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69  n.  Clear its di
1a8c0 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f  rty bit and remo
1a8d0 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a  ve it from the.*
1a8e0 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73  * dirty page lis
1a8f0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1a900 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
1a910 72 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  r *pPg){.  sqlit
1a920 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1a930 6e 28 70 50 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n(pPg);.}.../*.*
1a940 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
1a950 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
1a960 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
1a970 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
1a980 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
1a990 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
1a9a0 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
1a9b0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
1a9c0 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
1a9d0 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
1a9e0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
1a9f0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
1aa00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1aa10 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
1aa20 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
1aa30 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
1aa40 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
1aa50 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1aa60 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
1aa70 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
1aa80 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
1aa90 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
1aaa0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1aab0 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
1aac0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
1aad0 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
1aae0 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
1aaf0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
1ab00 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
1ab10 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
1ab20 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
1ab30 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
1ab40 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
1ab50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
1ab60 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
1ab70 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
1ab80 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
1ab90 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1aba0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1abb0 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
1abc0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
1abd0 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
1abe0 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
1abf0 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
1ac00 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
1ac10 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
1ac20 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
1ac30 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29  te3PagerCommit()
1ac40 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
1ac50 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  Rollback() to.**
1ac60 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
1ac70 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
1ac80 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1ac90 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
1aca0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
1acb0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1acc0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1acd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ace0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1acf0 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
1ad00 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1ad10 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
1ad20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ad30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1ad40 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
1ad50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ad60 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
1ad70 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1ad80 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
1ad90 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1ada0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1adb0 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  age was previous
1adc0 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1add0 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1ade0 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77  hat means.  ** w
1adf0 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20  e didn't really 
1ae00 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  read in the cont
1ae10 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1ae20 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
1ae30 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d  n.  ** (for exam
1ae40 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61  ple) when the pa
1ae50 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65  ge is being move
1ae60 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1ae70 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77  t.  But.  ** now
1ae80 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73   we are (perhaps
1ae90 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67  ) moving the pag
1aea0 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65  e off of the fre
1aeb0 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72  elist for.  ** r
1aec0 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64  euse and we need
1aed0 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69   to know its ori
1aee0 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f  ginal content so
1aef0 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20   that content.  
1af00 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ** can be stored
1af10 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1af20 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f   journal.  So do
1af30 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69   the read at thi
1af40 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a  s.  ** time..  *
1af50 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67  /.  rc = pager_g
1af60 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
1af70 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1af80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1af90 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
1afa0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
1afb0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
1afc0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1afd0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1afe0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
1aff0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
1b000 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
1b010 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
1b020 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
1b030 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c  PGHDR_IN_JOURNAL
1b040 29 0a 20 20 20 26 26 20 28 70 61 67 65 49 6e 53  ).   && (pageInS
1b050 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c  tatement(pPg) ||
1b060 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1b070 73 65 3d 3d 30 29 20 0a 20 20 29 7b 0a 20 20 20  se==0) .  ){.   
1b080 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1b090 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  che = 1;.    pPa
1b0a0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
1b0b0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1b0c0 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1b0d0 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1b0e0 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1b0f0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1b100 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1b110 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1b120 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1b130 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1b140 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1b150 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1b160 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1b170 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1b180 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1b190 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1b1a0 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1b1b0 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1b1c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1b1d0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1b1e0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1b1f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b200 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1b210 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b230 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b240 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b250 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1b260 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1b270 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1b280 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1b290 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1b2a0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50  .          && pP
1b2b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1b2c0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
1b2d0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
1b2e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
1b2f0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
1b300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1b310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b320 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b330 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1b340 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  ache = 1;.    pP
1b350 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
1b360 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
1b370 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1b380 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
1b390 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
1b3a0 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
1b3b0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1b3c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
1b3d0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
1b3e0 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
1b3f0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
1b400 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
1b410 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
1b420 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
1b430 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
1b440 20 20 69 66 28 20 21 28 70 50 67 2d 3e 66 6c 61    if( !(pPg->fla
1b450 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52  gs&PGHDR_IN_JOUR
1b460 4e 41 4c 29 20 26 26 20 28 70 50 61 67 65 72 2d  NAL) && (pPager-
1b470 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1b480 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20  MEMDB) ){.      
1b490 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
1b4a0 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1b4b0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1b4c0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1b4d0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1b4e0 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
1b4f0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1b500 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1b510 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1b520 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b530 65 33 50 63 61 63 68 65 50 72 65 73 65 72 76 65  e3PcachePreserve
1b540 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pPg, 0);.      
1b550 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b570 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b580 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b5a0 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
1b5b0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1b5c0 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20  pData2;..       
1b5d0 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
1b5e0 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
1b5f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b600 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
1b610 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
1b620 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
1b630 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
1b640 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
1b650 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
1b660 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1b670 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
1b680 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
1b690 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
1b6a0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
1b6b0 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
1b6c0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1b6d0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1b6e0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
1b6f0 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
1b700 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
1b710 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
1b720 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1b730 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
1b740 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b750 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
1b760 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1b770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b780 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1b790 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1b7a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
1b7b0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1b7c0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b7f0 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a  ournalOff + 4);.
1b800 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1b810 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
1b820 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1b830 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+4;.          
1b840 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1b850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b860 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1b870 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1b880 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1b890 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
1b8a0 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
1b8b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1b8c0 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
1b8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b8e0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
1b8f0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
1b900 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1b910 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
1b920 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1b930 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
1b940 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
1b950 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1b960 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1b970 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
1b980 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  t);.          PA
1b990 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e  GERTRACE5("JOURN
1b9a0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
1b9b0 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
1b9c0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1b9d0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1b9e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1b9f0 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
1ba00 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
1ba10 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1ba20 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
1ba30 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20  gehash(pPg));.. 
1ba40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
1ba50 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
1ba60 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1ba70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1ba80 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
1ba90 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
1baa0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1bab0 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
1bac0 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
1bad0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1bae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1bb00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1bb10 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50   }..          pP
1bb20 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
1bb30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1bb40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1bb50 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
1bb60 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
1bb70 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
1bb80 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
1bb90 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
1bba0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
1bbb0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1bbc0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1bbd0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1bbe0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bbf0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1bc00 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1bc10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1bc20 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1bc30 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67  er->pInStmt, pPg
1bc40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1bc50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1bc60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bc70 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1bc80 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1bc90 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
1bca0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
1bcb0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
1bcc0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
1bcd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bce0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50   PAGERTRACE4("AP
1bcf0 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
1bd00 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1bd30 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
1bd40 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
1bd50 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1bd60 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 3b 0a  ED_SYNC)?1:0));.
1bd70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bd80 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1bd90 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
1bda0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1bdb0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1bdc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1bdd0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
1bde0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
1bdf0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
1be00 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1be10 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
1be20 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1be30 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
1be40 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
1be50 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
1be60 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1be70 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
1be80 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
1be90 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
1bea0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
1beb0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
1bec0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
1bed0 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
1bee0 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
1bef0 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
1bf00 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
1bf10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1bf20 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70 61  Use .     && !pa
1bf30 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
1bf40 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74  g) .     && (int
1bf50 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
1bf60 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20  er->stmtSize .  
1bf70 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
1bf80 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
1bf90 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29  GHDR_IN_JOURNAL)
1bfa0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1bfb0 20 20 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e     || (int)pPg->
1bfc0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1bfd0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
1bfe0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1bff0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c000 65 33 50 63 61 63 68 65 50 72 65 73 65 72 76 65  e3PcachePreserve
1c010 28 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pPg, 1);.      
1c020 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c040 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
1c060 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
1c070 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1c080 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1c090 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1c0a0 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
1c0b0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f 66 66  .        i64 off
1c0c0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
1c0d0 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
1c0e0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c0f0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1c100 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1c110 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1c120 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
1c130 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1c140 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  s(pPager->stfd, 
1c150 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
1c160 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1c170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c180 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c190 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1c1a0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61  Pager->stfd, pDa
1c1b0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1c1c0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1c1d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c1e0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1c1f0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1c200 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1c210 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1c220 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1c230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c250 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c260 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1c270 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
1c280 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1c290 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
1c2a0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1c2b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
1c2c0 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
1c2d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1c2e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c2f0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
1c300 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
1c310 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
1c320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c330 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1c340 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70  HARED );.  if( p
1c350 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
1c360 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
1c370 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c380 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
1c390 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26      if( !MEMDB &
1c3a0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
1c3b0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
1c3c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1c3d0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1c3e0 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
1c3f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c410 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1c420 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d   to mark a data-
1c430 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65  page as writable
1c440 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61  . It uses .** pa
1c450 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f  ger_write() to o
1c460 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
1c470 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  le (if it is not
1c480 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a   already open).*
1c490 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  * and write the 
1c4a0 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74  page *pData to t
1c4b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1c4c0 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
1c4d0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
1c4e0 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
1c4f0 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
1c500 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
1c510 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
1c520 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
1c530 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
1c540 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
1c550 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
1c560 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
1c570 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
1c580 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
1c590 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
1c5a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1c5b0 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
1c5c0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
1c5d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
1c5e0 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
1c5f0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
1c600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1c610 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1c620 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1c630 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1c640 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
1c650 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
1c660 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1c670 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1c680 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44  e);..  if( !MEMD
1c690 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
1c6a0 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
1c6b0 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
1c6c0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1c6d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1c6e0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1c6f0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
1c700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c710 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1c720 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1c730 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1c740 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
1c750 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c760 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1c770 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
1c780 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
1c790 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
1c7a0 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
1c7b0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 0;..    /* Set
1c7c0 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1c7d0 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1c7e0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1c7f0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1c800 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1c810 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1c820 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1c830 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1c840 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1c850 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1c860 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1c870 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
1c880 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1c890 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
1c8a0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
1c8b0 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
1c8c0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
1c8d0 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
1c8e0 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
1c8f0 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
1c900 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
1c910 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
1c920 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1c930 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1c940 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1c950 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
1c960 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
1c970 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
1c980 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
1c990 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74   + 1;..    sqlit
1c9a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1c9b0 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29  (pPager, (int *)
1c9c0 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20  &nPageCount);.  
1c9d0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1c9e0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1c9f0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
1ca00 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
1ca10 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1ca20 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
1ca30 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
1ca40 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1ca50 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
1ca60 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
1ca70 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1ca80 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1ca90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
1caa0 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
1cab0 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
1cac0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
1cad0 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
1cae0 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
1caf0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1cb00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1cb10 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
1cb20 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
1cb30 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
1cb40 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
1cb50 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
1cb60 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
1cb70 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
1cb80 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
1cb90 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
1cba0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1cbb0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
1cbc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1cbd0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
1cbe0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
1cbf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cc00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cc10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1cc20 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1cc30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
1cc40 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
1cc50 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
1cc70 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1cc80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cc90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1cca0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
1ccb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ccc0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1ccd0 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
1cce0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1ccf0 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
1cd00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1cd10 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1cd20 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
1cd30 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
1cd40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cd50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1cd60 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
1cd70 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1cd80 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e  /* If the PgHdr.
1cd90 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1cda0 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
1cdb0 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
1cdc0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
1cdd0 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
1cde0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
1cdf0 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
1ce00 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
1ce10 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1ce20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
1ce30 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
1ce40 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
1ce50 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1ce60 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
1ce70 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
1ce80 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
1ce90 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
1cea0 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
1ceb0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
1cec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ced0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1cee0 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ( needSync ){.  
1cef0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
1cf00 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f  DB && pPager->no
1cf10 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
1cf20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
1cf30 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b  age && needSync;
1cf40 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1cf50 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
1cf60 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1cf70 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
1cf80 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
1cf90 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
1cfa0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1cfb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1cfc0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
1cfd0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1cfe0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1cff0 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
1d000 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1d010 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1d020 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
1d030 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
1d040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1d050 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1d060 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
1d070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d080 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1d090 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
1d0a0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1d0b0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
1d0c0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
1d0d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d0e0 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
1d0f0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
1d100 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
1d110 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
1d120 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1d130 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1d140 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
1d150 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1d160 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
1d170 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
1d180 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
1d190 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1d1a0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
1d1b0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
1d1c0 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
1d1d0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1d1e0 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
1d1f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
1d200 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
1d210 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
1d220 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
1d230 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
1d240 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
1d250 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
1d260 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
1d270 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1d280 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
1d290 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
1d2a0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
1d2b0 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
1d2c0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
1d2d0 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
1d2e0 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
1d2f0 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
1d300 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
1d310 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
1d320 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
1d330 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
1d340 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1d350 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62  DontRollback() b
1d360 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
1d370 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
1d380 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
1d390 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
1d3a0 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
1d3b0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
1d3c0 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
1d3d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1d3e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
1d3f0 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
1d400 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
1d410 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
1d420 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
1d430 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1d440 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
1d450 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
1d460 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
1d470 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
1d480 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
1d490 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
1d4a0 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
1d4b0 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
1d4c0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1d4d0 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
1d4e0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
1d4f0 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
1d500 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
1d510 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
1d520 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
1d530 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
1d540 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
1d550 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1d560 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
1d570 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
1d580 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
1d590 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d5a0 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
1d5b0 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ed,.** the sqlit
1d5c0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1d5d0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
1d5e0 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
1d5f0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67  cause the.** pag
1d600 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69  e contains criti
1d610 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
1d620 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
1d630 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f  re it gets.** ro
1d640 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
1d650 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  te of the sqlite
1d660 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1d670 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e  ck() call..*/.in
1d680 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  t sqlite3PagerDo
1d690 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  ntWrite(DbPage *
1d6a0 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64  pDbPage){.  PgHd
1d6b0 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
1d6c0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1d6d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1d6e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1d6f0 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e  ( MEMDB || pPg->
1d700 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1d710 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  gDbSize ){.    r
1d720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d730 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1d740 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
1d750 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ck==0 ){.    ass
1d760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1d770 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
1d780 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
1d790 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
1d7a0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
1d7b0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29  ger->origDbSize)
1d7c0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1d7d0 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
1d7e0 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
1d7f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1d800 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20  .    }.  }.  rc 
1d810 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
1d820 65 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61  et(pPager->pAlwa
1d830 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d  ysRollback, pPg-
1d840 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 72  >pgno);..  if( r
1d850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d860 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
1d870 52 5f 44 49 52 54 59 29 20 26 26 20 21 70 50 61  R_DIRTY) && !pPa
1d880 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1d890 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1d8a0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1d8b0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
1d8c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1d8d0 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
1d8e0 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
1d8f0 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
1d900 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
1d910 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
1d920 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
1d930 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
1d940 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
1d950 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
1d960 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
1d970 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
1d980 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
1d990 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
1d9a0 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
1d9b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d9c0 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
1d9d0 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
1d9e0 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
1d9f0 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
1da00 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
1da10 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
1da20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
1da30 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
1da40 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
1da50 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
1da60 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
1da70 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1da80 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
1da90 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
1daa0 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
1dab0 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
1dac0 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
1dad0 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
1dae0 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
1daf0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1db00 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
1db10 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1db20 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
1db30 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1db40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
1db50 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1db60 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
1db70 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
1db80 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1db90 29 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61  ).      pPg->fla
1dba0 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
1dbb0 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53  _WRITE;.#ifdef S
1dbc0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1dbd0 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
1dbe0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1dbf0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
1dc00 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  dif.    }.  }.  
1dc10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1dc20 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1dc30 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1dc40 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1dc50 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1dc60 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1dc70 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1dc80 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1dc90 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1dca0 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1dcb0 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1dcc0 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1dcd0 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1dce0 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1dcf0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1dd00 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  nal..**.** If we
1dd10 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63   have not yet ac
1dd20 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20  tually read the 
1dd30 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
1dd40 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20  page (if.** the 
1dd50 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
1dd60 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e  lag is set) then
1dd70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   this routine ac
1dd80 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a  ts as a promise.
1dd90 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ** that we will 
1dda0 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65  never need to re
1ddb0 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ad the page cont
1ddc0 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  ent in the futur
1ddd0 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65  e..** so the nee
1dde0 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62  dRead flag can b
1ddf0 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69  e cleared at thi
1de00 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  s point..*/.void
1de10 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1de20 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65  tRollback(DbPage
1de30 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1de40 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1de50 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Pager;..  assert
1de60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1de70 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1de80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1de90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1dea0 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e  not open, or Don
1deb0 74 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65  tWrite() has bee
1dec0 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a  n called on.  **
1ded0 20 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74   this page (Dont
1dee0 57 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65  Write() sets the
1def0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1df00 66 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73  flag), then this
1df10 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  .  ** function i
1df20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1df30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1df40 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20  urnalOpen==0 .  
1df50 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
1df60 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 41  cTest(pPager->pA
1df70 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70  lwaysRollback, p
1df80 50 67 2d 3e 70 67 6e 6f 29 0a 20 20 20 7c 7c 20  Pg->pgno).   || 
1df90 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1dfa0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 0a 20 20 29  ->origDbSize.  )
1dfb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1dfc0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  }.  assert( !MEM
1dfd0 44 42 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72 20  DB );    /* For 
1dfe0 61 20 6d 65 6d 64 62 2c 20 70 50 61 67 65 72 2d  a memdb, pPager-
1dff0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73 20  >journalOpen is 
1e000 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a 23 69 66  always 0 */..#if
1e010 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
1e020 45 5f 44 45 4c 45 54 45 0a 20 20 69 66 28 20 28  E_DELETE.  if( (
1e030 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
1e040 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 21 3d  DR_IN_JOURNAL)!=
1e050 30 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  0 || (int)pPg->p
1e060 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1e070 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  DbSize ){.    re
1e080 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
1e090 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52 45  ..  /* If SECURE
1e0a0 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61 62  _DELETE is disab
1e0b0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20  led, then there 
1e0c0 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
1e0d0 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  his.  ** routine
1e0e0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 6f   can be called o
1e0f0 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68 69  n a page for whi
1e100 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ch sqlite3PagerD
1e110 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a 20  ontWrite().  ** 
1e120 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
1e130 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 64  viously called d
1e140 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74  uring the same t
1e150 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
1e160 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69 74   And if DontWrit
1e170 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75 73  e() has previous
1e180 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  ly been called, 
1e190 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
1e1a0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  ** conditions mu
1e1b0 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a 0a  st be met..  **.
1e1c0 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20 4e    ** (Later:)  N
1e1d0 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74 68 65  ot true.  If the
1e1e0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
1e1f0 72 75 70 74 65 64 20 62 79 20 68 61 76 69 6e 67  rupted by having
1e200 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a 20   duplicate.  ** 
1e210 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1e220 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72 72 75  elist (ex: corru
1e230 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e 20 74  pt9.test) then t
1e240 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1e250 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
1e260 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f 0a  rily true:.  */.
1e270 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
1e280 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1e290 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
1e2a0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
1e2b0 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61 73  Size ); */..  as
1e2c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1e2d0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
1e2e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
1e2f0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
1e300 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
1e310 3b 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c  ;.  pPg->flags |
1e320 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  = PGHDR_IN_JOURN
1e330 41 4c 3b 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73  AL;.  pPg->flags
1e340 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
1e350 52 45 41 44 3b 0a 20 20 69 66 28 20 70 50 61 67  READ;.  if( pPag
1e360 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1e370 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e380 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3e 3d  ger->stmtSize >=
1e390 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1e3a0 69 7a 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ize );.    sqlit
1e3b0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1e3c0 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67  er->pInStmt, pPg
1e3d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 50  ->pgno);.  }.  P
1e3e0 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
1e3f0 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
1e400 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1e410 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1e420 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
1e430 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20  CE(("GARBAGE %p 
1e440 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1e450 50 67 2d 3e 70 67 6e 6f 29 29 0a 7d 0a 0a 0a 2f  Pg->pgno)).}.../
1e460 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e470 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
1e480 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
1e490 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
1e4a0 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
1e4b0 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
1e4c0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
1e4d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e4e0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1e4f0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
1e500 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
1e510 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20  irect){.  PgHdr 
1e520 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
1e530 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
1e540 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e550 5f 4f 4b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  _OK;..#ifndef SQ
1e560 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
1e570 49 43 5f 57 52 49 54 45 0a 20 20 61 73 73 65 72  IC_WRITE.  asser
1e580 74 28 20 69 73 44 69 72 65 63 74 3d 3d 30 20 29  t( isDirect==0 )
1e590 3b 20 20 2f 2a 20 69 73 44 69 72 65 63 74 20 69  ;  /* isDirect i
1e5a0 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72 20  s only true for 
1e5b0 61 74 6f 6d 69 63 20 77 72 69 74 65 73 20 2a 2f  atomic writes */
1e5c0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
1e5d0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1e5e0 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a  ntDone ){.    /*
1e5f0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1e600 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1e610 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
1e620 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1e630 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
1e640 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
1e650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e660 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69  eturn rc;..    i
1e670 66 28 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a  f( !isDirect ){.
1e680 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e690 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
1e6a0 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Hdr);.      if( 
1e6b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e6c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e6d0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
1e6e0 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
1e6f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1e700 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
1e710 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1e720 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1e730 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1e740 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
1e750 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1e760 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1e770 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
1e780 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63  FileVers);.    c
1e790 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
1e7a0 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28  .    put32bits((
1e7b0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
1e7c0 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
1e7d0 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 23 69 66 64  _counter);..#ifd
1e7e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e7f0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1e800 20 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26    if( isDirect &
1e810 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
1e820 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
1e830 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
1e840 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61   = pPgHdr->pData
1e850 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1e860 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1e870 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
1e880 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1e890 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  0);.    }.#endif
1e8a0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
1e8b0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
1e8c0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
1e8d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1e8e0 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
1e8f0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1e900 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
1e910 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e920 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
1e930 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a   file to disk..*
1e940 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e950 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
1e960 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1e970 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1e980 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e990 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
1e9a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1e9b0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1e9c0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1e9d0 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gs);.  }.  retur
1e9e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1e9f0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1ea00 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
1ea10 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
1ea20 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
1ea30 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
1ea40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1ea50 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1ea60 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1ea70 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
1ea80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
1ea90 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
1eaa0 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
1eab0 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
1eac0 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
1ead0 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
1eae0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1eaf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1eb00 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
1eb10 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1eb20 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
1eb30 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
1eb40 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
1eb50 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
1eb60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1eb70 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
1eb80 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
1eb90 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
1eba0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ebb0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1ebc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1ebd0 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
1ebe0 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
1ebf0 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
1ec00 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
1ec10 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
1ec20 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
1ec30 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
1ec40 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
1ec50 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  an sqlite3PagerC
1ec60 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
1ec70 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
1ec80 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
1ec90 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1eca0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1ecb0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
1ecc0 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
1ecd0 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
1ece0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1ecf0 74 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20  tabases)..**.** 
1ed00 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
1ed10 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
1ed20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
1ed30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ed40 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
1ed50 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
1ed60 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
1ed70 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1ed80 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
1ed90 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
1eda0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
1edb0 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
1edc0 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
1edd0 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
1ede0 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
1edf0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
1ee00 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1ee10 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
1ee20 2a 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73  *pPager, .  cons
1ee30 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
1ee40 20 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c   .  Pgno nTrunc,
1ee50 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b  .  int noSync.){
1ee60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ee70 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
1ee80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1ee90 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1eea0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1eeb0 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61  ..  /* If no cha
1eec0 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d  nges have been m
1eed0 61 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76  ade, we can leav
1eee0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
1eef0 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20  n early..  */.  
1ef00 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
1ef10 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20  dified==0 &&.   
1ef20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f       (pPager->jo
1ef30 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1ef40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
1ef50 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ETE ||.         
1ef60 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1ef70 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20  veMode!=0) ){.  
1ef80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ef90 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
1efa0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1efb0 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
1efc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1efd0 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  K;.  }..  PAGERT
1efe0 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20  RACE4("DATABASE 
1eff0 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
1f000 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d  aster=%s nTrunc=
1f010 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
1f020 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f030 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
1f040 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1f050 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1f060 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
1f070 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1f080 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
1f090 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
1f0a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1f0b0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
1f0c0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1f0d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1f0e0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
1f0f0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
1f100 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
1f110 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a     PgHdr *pPg;..
1f120 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1f130 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1f140 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f  E.    /* The ato
1f150 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
1f160 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
1f170 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
1f180 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
1f190 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
1f1a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  **.    **    + T
1f1b0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
1f1c0 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
1f1d0 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
1f1e0 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  y for.    **    
1f1f0 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
1f200 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a   page-size, and.
1f210 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73      **    + This
1f220 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
1f230 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
1f240 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
1f250 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
1f260 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
1f270 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
1f280 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
1f290 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1f2a0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1f2b0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
1f2c0 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
1f2d0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1f2e0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
1f2f0 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65  er.    ** be cre
1f300 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
1f310 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
1f320 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f  /.    int useAto
1f330 6d 69 63 57 72 69 74 65 3b 0a 20 20 20 20 70 50  micWrite;.    pP
1f340 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
1f350 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1f360 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
1f370 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20   useAtomicWrite 
1f380 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61  = (.        !zMa
1f390 73 74 65 72 20 26 26 20 0a 20 20 20 20 20 20 20  ster && .       
1f3a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f3b0 4f 70 65 6e 20 26 26 0a 20 20 20 20 20 20 20 20  Open &&.        
1f3c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f3d0 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69  ff==jrnlBufferSi
1f3e0 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a 20  ze(pPager) && . 
1f3f0 20 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30         nTrunc==0
1f400 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 70 50   && .        (pP
1f410 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 44 69  g==0 || pPg->pDi
1f420 72 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b 0a 20  rty==0).    );. 
1f430 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1f440 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1f450 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1f460 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
1f470 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
1f480 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69      if( useAtomi
1f490 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  cWrite ){.      
1f4a0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52  /* Update the nR
1f4b0 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
1f4c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
1f4d0 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65  .      int offse
1f4e0 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
1f4f0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
1f500 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
1f510 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
1f520 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20  ger->nRec==1);. 
1f530 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
1f540 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
1f550 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65  d, offset, pPage
1f560 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
1f570 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
1f580 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
1f590 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  unter. The follo
1f5a0 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
1f5b0 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74  odify.      ** t
1f5c0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
1f5d0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
1f5e0 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65  age 1 to include
1f5f0 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20   the updated.   
1f600 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75     ** change cou
1f610 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
1f620 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63  ite page 1 direc
1f630 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
1f640 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
1f650 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
1f660 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
1f670 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
1f680 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
1f690 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
1f6a0 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a  is safe..      *
1f6b0 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
1f6c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f6d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1f6e0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1f6f0 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
1f700 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1f710 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1f720 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
1f730 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
1f740 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
1f750 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26  useAtomicWrite &
1f760 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1f770 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ).#endif..    /*
1f780 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1f790 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
1f7a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f7b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
1f7c0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1f7d0 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
1f7e0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
1f7f0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1f800 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
1f810 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
1f820 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
1f830 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
1f840 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
1f850 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1f860 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
1f870 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
1f880 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
1f890 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
1f8a0 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
1f8b0 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
1f8c0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1f8d0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1f8e0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1f8f0 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
1f900 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1f910 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1f920 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  er, 0);.      if
1f930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f940 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1f950 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1f960 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
1f970 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1f980 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64 65  DE_OFF ){.#ifnde
1f990 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f9a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
1f9b0 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1f9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1f9d0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1f9e0 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
1f9f0 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
1fa00 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
1fa10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
1fa20 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
1fa30 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
1fa40 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
1fa50 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
1fa60 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65           ** file
1fa70 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1fa80 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b           Pgno i;
1fa90 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1faa0 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
1fab0 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
1fac0 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
1fad0 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
1fae0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
1faf0 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
1fb00 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
1fb10 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
1fb20 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
1fb30 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
1fb50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1fb60 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1fb70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1fb80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fb90 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1fba0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1fbb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fbc0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
1fbd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fbe0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1fbf0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1fc00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fc10 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1fc20 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1fc30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fc40 20 20 7d 20 0a 20 20 20 20 20 20 20 20 7d 0a 23    } .        }.#
1fc50 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63  endif.        rc
1fc60 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
1fc70 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
1fc80 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
1fc90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fca0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fcb0 69 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  it;.        rc =
1fcc0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1fcd0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
1fce0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1fcf0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1fd00 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66   sync_exit;..#if
1fd10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fd20 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1fd30 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1fd40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1fd50 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1fd60 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
1fd70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1fd80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1fd90 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1fda0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1fdb0 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
1fdc0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
1fdd0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1fde0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1fdf0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1fe00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1fe10 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1fe20 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1fe30 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1fe40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fe50 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
1fe60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
1fe70 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 2f  OCKED );.      /
1fe80 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67 68  * The error migh
1fe90 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65 20  t have left the 
1fea0 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20 66  dirty list all f
1feb0 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a 20  ouled up here,. 
1fec0 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61 74       ** but that
1fed0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
1fee0 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65 20   because if the 
1fef0 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  if the dirty lis
1ff00 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20 67  t did.      ** g
1ff10 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  et corrupted, th
1ff20 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1ff30 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63  on will roll bac
1ff40 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64  k and.      ** d
1ff50 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74 79  iscard the dirty
1ff60 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69 73   list.  There is
1ff70 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20 20   an assert in.  
1ff80 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65 74      ** pager_get
1ff90 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1ffa0 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65 73  () that verifies
1ffb0 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70 74   that no attempt
1ffc0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61 64  .      ** is mad
1ffd0 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76 61  e to use an inva
1ffe0 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e 0a  lid dirty list..
1fff0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 67        */.      g
20000 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
20010 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20020 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
20030 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
20040 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
20050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20060 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
20070 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21  ger->noSync && !
20080 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
20090 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
200a0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
200b0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
200c0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  s);.    }.    IO
200d0 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
200e0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
200f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20100 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
20110 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
20120 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
20130 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20140 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
20150 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
20160 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  );.  }..sync_exi
20170 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t:.  if( rc==SQL
20180 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
20190 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  D ){.    /* page
201a0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
201b0 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d  nter() may attem
201c0 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  pt to obtain an 
201d0 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a  exclusive.     *
201e0 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74   lock to spill t
201f0 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74  he cache and ret
20200 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  urn IOERR_BLOCKE
20210 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20  D. But since .  
20220 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f     * there is no
20230 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68   chance the cach
20240 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e is inconsisten
20250 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a 20  t, it is.     * 
20260 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e  better to return
20270 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
20280 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
20290 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
202a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
202b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
202c0 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
202d0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
202e0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
202f0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
20300 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
20310 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
20320 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
20330 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
20340 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
20350 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
20360 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
20370 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
20380 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
20390 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
203a0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
203b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
203c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
203d0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
203e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
203f0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
20400 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
20410 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
20420 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
20430 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
20440 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
20450 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
20460 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
20470 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
20480 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
20490 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
204a0 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
204b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
204c0 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
204d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
204e0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
204f0 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
20500 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
20510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20520 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 50 41  ITE_OK;.  }.  PA
20530 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  GERTRACE2("COMMI
20540 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
20550 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
20560 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71   MEMDB ){.    sq
20570 6c 69 74 65 33 50 63 61 63 68 65 43 6f 6d 6d 69  lite3PcacheCommi
20580 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
20590 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
205a0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
205b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
205c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
205d0 61 63 68 65 41 73 73 65 72 74 46 6c 61 67 73 28  acheAssertFlags(
205e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
205f0 20 30 2c 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55   0, PGHDR_IN_JOU
20600 52 4e 41 4c 29 3b 0a 20 20 20 20 70 50 61 67 65  RNAL);.    pPage
20610 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20620 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
20630 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
20640 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
20650 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50  ER_SYNCED || !pP
20660 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20670 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
20680 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
20690 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
206a0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
206b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
206c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
206d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
206e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
206f0 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
20700 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
20710 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
20720 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
20730 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
20740 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
20750 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
20760 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
20770 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
20780 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
20790 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
207a0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
207b0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
207c0 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
207d0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
207e0 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
207f0 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c   protocol or unl
20800 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
20810 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
20820 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
20830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20840 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
20850 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
20860 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
20870 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
20880 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
20890 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
208a0 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
208b0 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
208c0 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
208d0 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
208e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
208f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20900 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
20910 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
20920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20930 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
20940 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
20950 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
20960 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
20970 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
20980 68 65 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  heRollback(pPage
20990 72 2d 3e 70 50 43 61 63 68 65 2c 20 31 2c 20 70  r->pPCache, 1, p
209a0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
209b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
209c0 61 63 68 65 52 6f 6c 6c 62 61 63 6b 28 70 50 61  acheRollback(pPa
209d0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c  ger->pPCache, 0,
209e0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
209f0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
20a00 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
20a10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
20a20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
20a30 68 65 41 73 73 65 72 74 46 6c 61 67 73 28 70 50  heAssertFlags(pP
20a40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 30  ager->pPCache, 0
20a50 2c 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  , PGHDR_IN_JOURN
20a60 41 4c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  AL);.    pPager-
20a70 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
20a80 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
20a90 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
20aa0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
20ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
20ac0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
20ad0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
20ae0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
20af0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
20b00 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
20b10 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
20b20 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
20b30 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
20b40 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
20b50 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
20b60 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
20b70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
20b80 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
20b90 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
20ba0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
20bb0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
20bc0 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
20bd0 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
20be0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
20bf0 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67   }.    rc = pPag
20c00 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
20c10 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
20c20 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
20c30 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
20c40 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20       int rc2;.  
20c50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
20c60 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
20c70 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20  0);.      rc2 = 
20c80 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
20c90 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
20ca0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
20cb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20cd0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
20ce0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
20cf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20d00 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
20d10 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  er, 0);.    }.. 
20d20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
20d30 65 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 2f 2a 20  e = -1;..    /* 
20d40 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
20d50 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c  rs during a ROLL
20d60 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20  BACK, we can no 
20d70 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65  longer trust the
20d80 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61   pager.    ** ca
20d90 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
20da0 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
20db0 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
20dc0 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20  e any error .   
20dd0 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   ** persistent..
20de0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
20df0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
20e00 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  er, rc);.  }.  r
20e10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20e20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
20e30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20e40 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
20e50 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
20e60 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
20e70 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
20e80 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
20e90 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
20ea0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
20eb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20ec0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
20ed0 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
20ee0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20ef0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
20f00 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
20f10 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
20f20 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
20f30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20f40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
20f50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
20f60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20f70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20f80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
20f90 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20fa0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
20fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20fc0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
20fd0 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  DbPage *pPage){.
20fe0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20ff0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
21000 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69  nt(pPage);.}..#i
21010 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
21020 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
21030 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
21040 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
21050 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
21060 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
21070 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
21080 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
21090 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
210a0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
210b0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
210c0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d  pPCache);.  a[1]
210d0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
210e0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
210f0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
21100 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  2] = sqlite3Pcac
21110 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70  heGetCachesize(p
21120 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
21130 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
21140 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
21150 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
21160 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
21170 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
21180 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
21190 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
211a0 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
211b0 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
211c0 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
211d0 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
211e0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
211f0 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
21200 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
21210 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n a;.}.int sqlit
21220 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50  e3PagerIsMemdb(P
21230 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21240 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d   return MEMDB;.}
21250 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
21260 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
21270 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
21280 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21290 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
212a0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
212b0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
212c0 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
212d0 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
212e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
212f0 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
21300 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
21310 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
21320 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
21330 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
21340 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
21350 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
21360 74 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e  t pagerStmtBegin
21370 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21380 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
21390 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74  ert( !pPager->st
213a0 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73  mtInUse );.  ass
213b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
213c0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
213d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
213e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
213f0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
21400 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
21410 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
21420 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
21430 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
21440 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
21450 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21460 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
21470 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
21480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
21490 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
214a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
214b0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
214c0 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
214d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
214e0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
214f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21500 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  Open );.  assert
21510 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
21520 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  t==0 );.  pPager
21530 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->pInStmt = sqli
21540 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
21550 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
21560 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
21570 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
21580 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
21590 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
215a0 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
215b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
215c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
215d0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
215e0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
215f0 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
21600 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
21610 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
21620 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
21630 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
21640 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
21650 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
21660 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
21670 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
21680 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
21690 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
216a0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 53 51 4c  Pager->stfd, SQL
216b0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
216c0 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NAL);.    if( rc
216d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
216e0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
216f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
21700 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
21710 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
21720 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
21730 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
21740 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
21750 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
21760 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
21770 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
21780 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  pInStmt ){.    s
21790 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
217a0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
217b0 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
217c0 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->pInStmt = 0;. 
217d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
217e0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
217f0 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
21800 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21810 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 70 61 67  t rc;.  rc = pag
21820 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
21830 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
21840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
21850 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
21860 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21870 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67  erStmtCommit(Pag
21880 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
21890 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
218a0 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
218b0 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f  RTRACE2("STMT-CO
218c0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
218d0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
218e0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
218f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
21900 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
21910 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->pInStmt);.   
21920 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
21930 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mt = 0;.    }els
21940 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
21950 50 63 61 63 68 65 43 6f 6d 6d 69 74 28 70 50 61  PcacheCommit(pPa
21960 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 31 29  ger->pPCache, 1)
21970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
21980 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
21990 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
219a0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 7d  mtInUse = 0;.  }
219b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
219c0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
219d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
219e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
219f0 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
21a00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21a10 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28  gerStmtRollback(
21a20 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21a30 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
21a40 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
21a50 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  e ){.    PAGERTR
21a60 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
21a70 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
21a80 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
21a90 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
21aa0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
21ab0 65 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  eRollback(pPager
21ac0 2d 3e 70 50 43 61 63 68 65 2c 20 31 2c 20 70 50  ->pPCache, 1, pP
21ad0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 29  ager->xReiniter)
21ae0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
21af0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
21b00 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
21b10 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
21b20 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
21b30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21b40 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
21b50 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21b60 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
21b70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
21b80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
21b90 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
21ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
21bb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21bc0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
21bd0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
21be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21bf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21c00 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
21c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21c20 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
21c30 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
21c40 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
21c50 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21c60 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
21c70 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
21c80 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
21c90 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
21ca0 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
21cb0 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
21cc0 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
21cd0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21ce0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
21cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21d00 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
21d10 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
21d20 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
21d30 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
21d40 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
21d50 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
21d60 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
21d70 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
21d80 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
21d90 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
21da0 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
21db0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21dc0 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
21dd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21de0 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
21df0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21e00 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
21e10 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
21e20 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
21e30 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
21e40 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
21e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21e60 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
21e70 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
21e80 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
21e90 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
21ea0 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
21eb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21ec0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21ed0 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
21ee0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
21ef0 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
21f00 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
21f10 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
21f20 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
21f30 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
21f40 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
21f50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21f60 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
21f70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21f80 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
21f90 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
21fa0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
21fb0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
21fc0 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
21fd0 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
21fe0 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
21ff0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22000 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
22010 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
22020 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
22030 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
22040 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
22050 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
22060 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
22070 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e  pCodecArg;.}.#en
22080 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
22090 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
220a0 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
220b0 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
220c0 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
220d0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
220e0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
220f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
22100 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
22110 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
22120 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
22130 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
22140 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
22150 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
22160 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
22170 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
22180 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70  sly located at p
22190 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
221a0 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
221b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
221c0 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
221d0 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
221e0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
221f0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
22200 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
22210 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
22220 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
22230 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22240 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
22250 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
22260 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
22270 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
22280 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
22290 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
222a0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
222b0 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
222c0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
222d0 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
222e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
222f0 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
22300 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
22310 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
22320 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
22330 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
22340 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
22350 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
22360 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
22370 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
22380 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
22390 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
223a0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
223b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75  **.** If the fou
223c0 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73  rth argument, is
223d0 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a  Commit, is non-z
223e0 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
223f0 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  age is being.** 
22400 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66  moved as part of
22410 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72   a database reor
22420 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20  ganization just 
22430 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
22440 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65  action .** is be
22450 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  ing committed. I
22460 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20  n this case, it 
22470 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
22480 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
22490 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66  page .** pPg ref
224a0 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20  ers to will not 
224b0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67  be written to ag
224c0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
224d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
224e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
224f0 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
22500 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
22510 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
22520 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
22530 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
22540 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69   /* The page bei
22550 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
22560 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  */.  Pgno needSy
22570 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
22580 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
22590 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  >0 );..  PAGERTR
225a0 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE5("MOVE %d pa
225b0 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
225c0 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
225d0 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
225e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
225f0 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61  >pgno, (pPg->fla
22600 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
22610 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 3b 0a  NC)?1:0, pgno);.
22620 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
22630 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
22640 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
22650 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72   pgno))..  pager
22660 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
22670 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
22680 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
22690 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
226a0 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
226b0 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
226c0 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
226d0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
226e0 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
226f0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
22700 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
22710 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
22720 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
22730 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
22740 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
22750 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
22760 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
22770 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
22780 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
22790 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
227a0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
227b0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
227c0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
227d0 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
227e0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
227f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26  DR_NEED_SYNC) &&
22800 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20   !isCommit ){.  
22810 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
22820 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
22830 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
22840 61 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55  ags&PGHDR_IN_JOU
22850 52 4e 41 4c 29 20 7c 7c 20 28 69 6e 74 29 70 67  RNAL) || (int)pg
22860 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
22870 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
22880 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
22890 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
228a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
228b0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
228c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
228d0 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
228e0 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
228f0 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
22900 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
22910 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
22920 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
22930 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
22940 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
22950 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
22960 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
22970 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
22980 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
22990 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
229a0 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
229b0 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  */.  pPg->flags 
229c0 26 3d 20 7e 28 50 47 48 44 52 5f 4e 45 45 44 5f  &= ~(PGHDR_NEED_
229d0 53 59 4e 43 7c 50 47 48 44 52 5f 49 4e 5f 4a 4f  SYNC|PGHDR_IN_JO
229e0 55 52 4e 41 4c 29 3b 0a 20 20 70 50 67 4f 6c 64  URNAL);.  pPgOld
229f0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
22a00 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
22a10 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
22a20 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
22a30 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
22a40 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
22a50 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
22a60 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
22a70 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 20 20  ED_SYNC);.  }.  
22a80 69 66 28 20 73 71 6c 69 74 65 33 42 69 74 76 65  if( sqlite3Bitve
22a90 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
22aa0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 20  nJournal, pgno) 
22ab0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
22ac0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67  MEMDB );.    pPg
22ad0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
22ae0 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d  _IN_JOURNAL;.  }
22af0 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ..  sqlite3Pcach
22b00 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
22b10 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
22b20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
22b30 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20  cheMove(pPgOld, 
22b40 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  0);.    sqlite3P
22b50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
22b60 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 6d 61 6b  Old);.  }..  mak
22b70 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70  eDirty(pPg);.  p
22b80 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
22b90 65 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  e = 1;.  pPager-
22ba0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
22bb0 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
22bc0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
22bd0 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
22be0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
22bf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22c00 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
22c10 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
22c20 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
22c30 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
22c40 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
22c50 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
22c60 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
22c70 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
22c80 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
22c90 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
22ca0 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61     ** "is journa
22cb0 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67  led" bitvec flag
22cc0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
22cd0 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
22ce0 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20  remedied by.    
22cf0 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70  ** loading the p
22d00 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
22d10 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
22d20 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
22d30 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
22d40 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
22d50 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
22d60 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
22d70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
22d80 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
22d90 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
22da0 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
22db0 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
22dc0 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
22dd0 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
22de0 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
22df0 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
22e00 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
22e10 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
22e20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
22e30 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
22e40 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
22e50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
22e60 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
22e70 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
22e80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
22e90 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
22ea0 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
22eb0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
22ec0 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
22ed0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
22ee0 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
22ef0 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
22f00 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
22f10 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
22f20 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
22f30 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
22f40 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
22f50 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
22f60 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
22f70 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
22f80 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
22f90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22fa0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
22fb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22fc0 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
22fd0 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
22fe0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
22ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23000 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23010 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  pInJournal && (i
23020 6e 74 29 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  nt)needSyncPgno<
23030 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
23040 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ize ){.        s
23050 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
23060 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
23070 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
23080 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
23090 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
230a0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
230b0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
230c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
230d0 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21  ->noSync==0 && !
230e0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67  MEMDB );.    pPg
230f0 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  Hdr->flags |= PG
23100 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
23110 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73     pPgHdr->flags
23120 20 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55   |= PGHDR_IN_JOU
23130 52 4e 41 4c 3b 0a 20 20 20 20 6d 61 6b 65 44 69  RNAL;.    makeDi
23140 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20  rty(pPgHdr);.   
23150 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
23160 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
23170 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23180 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
23190 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
231a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
231b0 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
231c0 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
231d0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
231e0 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
231f0 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
23200 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50  Pg->nRef>0 || pP
23210 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  g->pPager->memDb
23220 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67   );.  return pPg
23230 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pData;.}../*.*
23240 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
23250 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
23260 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
23270 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
23280 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
23290 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
232a0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
232b0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
232c0 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
232d0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
232e0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
232f0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
23300 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74  pPager?pPg->pExt
23310 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ra:0);.}../*.** 
23320 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
23330 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
23340 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
23350 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
23360 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
23370 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
23380 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
23390 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
233a0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
233b0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
233c0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
233d0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
233e0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
233f0 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
23400 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
23410 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
23420 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
23430 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
23440 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
23450 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
23460 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
23470 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
23480 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
23490 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
234a0 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
234b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
234c0 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
234d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
234e0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
234f0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
23500 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23510 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
23520 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
23530 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
23540 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
23550 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
23560 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
23570 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
23580 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
23590 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
235a0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
235b0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
235c0 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
235d0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
235e0 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
235f0 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
23600 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
23610 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
23620 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65  xclusiveMode = e
23630 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
23640 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
23650 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
23660 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
23670 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
23680 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
23690 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
236a0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
236b0 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  .**.**    PAGER_
236c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
236d0 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  Y.**    PAGER_JO
236e0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
236f0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
23700 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
23710 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  E.**    PAGER_JO
23720 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
23730 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  T.**    PAGER_JO
23740 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a  URNALMODE_OFF.**
23750 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d  .** If the param
23760 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
23770 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  RY, then the jou
23780 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74  rnal-mode is set
23790 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   to the.** value
237a0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
237b0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69  * The returned i
237c0 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72 72  ndicate the curr
237d0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
237e0 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61  dated).** journa
237f0 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-mode..*/.int s
23800 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
23810 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
23820 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
23830 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
23840 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
23850 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
23860 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
23870 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
23880 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DE_DELETE.      
23890 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
238a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
238b0 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20  E_TRUNCATE.     
238c0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
238d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
238e0 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
238f0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
23900 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
23910 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
23920 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  rt( PAGER_JOURNA
23930 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  LMODE_QUERY<0 );
23940 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
23950 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
23960 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f  ournalMode = eMo
23970 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
23980 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
23990 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
239a0 45 5f 51 55 45 52 59 20 29 3b 0a 20 20 7d 0a 20  E_QUERY );.  }. 
239b0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
239c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
239d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
239e0 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
239f0 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
23a00 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
23a10 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  les..*/.i64 sqli
23a20 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
23a30 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  izeLimit(Pager *
23a40 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d  pPager, i64 iLim
23a50 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69  it){.  if( iLimi
23a60 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  t>=-1 ){.    pPa
23a70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
23a80 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a  Limit = iLimit;.
23a90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
23aa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
23ab0 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66  Limit;.}..#endif
23ac0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23ad0 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.