/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 52f2212429310cb4d2080d36b63d16cc42161a6f:


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 33 32  : pager.c,v 1.32
0350: 30 20 32 30 30 37 2f 30 34 2f 30 35 20 31 31 3a  0 2007/04/05 11:
0360: 35 34 3a 34 33 20 64 61 6e 69 65 6c 6b 31 39 37  54:43 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 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63   OsFile.** struc
0710: 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65  t as it's argume
0720: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  nt..*/.#define P
0730: 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29  AGERID(p) ((int)
0740: 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65  (p->fd)).#define
0750: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0760: 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a  ) ((int)fd)../*.
0770: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0780: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0790: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
07a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
07b0: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
07c0: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
07d0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07f0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
0800: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0810: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
0820: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
0830: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0840: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0850: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0860: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0870: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0880: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08a0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
08b0: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
08c0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
08d0: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
0910: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
0920: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0950: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0960: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0980: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0990: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
09a0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
09b0: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
09c0: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
09d0: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09e0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
0a10: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
0a20: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
0a30: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a60: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a70: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a80: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0ab0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0ac0: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0af0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0b00: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0b10: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0b20: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0b30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b40: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b50: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b60: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0ba0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0bb0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0bc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0be0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bf0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0c00: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0c30: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c40: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c50: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c60: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c70: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c80: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0ca0: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0cb0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0cc0: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cf0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0d00: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0d10: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0d30: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d40: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d50: 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20  emove or.**     
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a    truncate the j
0d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
0d90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0da0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0db0: 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62            will b
0dc0: 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  e committed..**.
0dd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0de0: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41  e comes up in PA
0df0: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0e00: 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a   first time a.**
0e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
0e20: 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73  () occurs, the s
0e30: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e40: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
0e50: 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70  ..** After all p
0e60: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ages have been r
0e70: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
0e80: 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28  lite_page_unref(
0e90: 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ),.** the state 
0ea0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b  transitions back
0eb0: 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   to PAGER_UNLOCK
0ec0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0ed0: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0ee0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
0ef0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f00: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f10: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f20: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
0f40: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0f50: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0f60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0f70: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0f80: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0f90: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0fa0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
0fb0: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
0fc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0fd0: 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  ).** PAGER_RESER
0fe0: 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74  VED means that t
0ff0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20  here is an open 
1000: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1010: 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ..** The transit
1020: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1030: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62 65  LUSIVE occurs be
1040: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1050: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1060: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1070: 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65 73  e, though writes
1080: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1090: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75  .** journal occu
10a0: 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41 47  rs with just PAG
10b0: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66  ER_RESERVED.  Af
10c0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61  ter an sqlite3Pa
10d0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  gerRollback().**
10e0: 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
10f0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1100: 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e 20  , the state can 
1110: 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  go back to PAGER
1120: 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69  _SHARED,.** or i
1130: 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50 41  t can stay at PA
1140: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66  GER_EXCLUSIVE if
1150: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
1160: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
1170: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1180: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1190: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
11a0: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
11b0: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
11c0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
11d0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
11e0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
11f0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
1200: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1210: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1220: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1230: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1240: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1250: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1260: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1270: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1280: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1290: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
12a0: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
12b0: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
12c0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
12d0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
12e0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12f0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
1300: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
1310: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1320: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1330: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1340: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1350: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1360: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1370: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1380: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1390: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
13a0: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
13b0: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
13c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
13d0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
13e0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
13f0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
1400: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
1410: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1420: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1430: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1440: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1450: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1460: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1470: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1480: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1490: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
14a0: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
14b0: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
14c0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
14d0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
14e0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
14f0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
1500: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
1510: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1520: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1530: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1560: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1570: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1580: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
15a0: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
15b0: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
15c0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
15d0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
15e0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
15f0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
1600: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
1610: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1620: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1630: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1640: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1650: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1660: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1670: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1680: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1690: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
16a0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
16b0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
16c0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
16d0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
16e0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
16f0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1700: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1710: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1720: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1730: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1740: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1750: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1760: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1770: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1780: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17a0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
17b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
17c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
17d0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
17e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
17f0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1800: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1810: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1820: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1830: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1840: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1850: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1860: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1870: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1880: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1890: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
18a0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
18b0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
18c0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
18d0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
18e0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
18f0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1900: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1910: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1920: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1930: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1940: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1950: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1960: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1970: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1980: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1990: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
19a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
19b0: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
19c0: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
19d0: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
19e0: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
19f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1a00: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
1a10: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
1a20: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
1a50: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
1a60: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a70: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a80: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a90: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1aa0: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1ab0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1ac0: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1ad0: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1ae0: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1af0: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1b00: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1b20: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1b30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1b40: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
1b50: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
1b60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
1b70: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
1b80: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
1b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ba0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
1bb0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1bc0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
1bd0: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf0: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
1c00: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
1c10: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
1c20: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1c40: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77   if we need to w
1c50: 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65  rite back change
1c60: 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  s */.  u8 needSy
1c70: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1c80: 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f        /* Sync jo
1c90: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69  urnal before wri
1ca0: 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a  ting this page *
1cb0: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1cc0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1cd0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
1ce0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
1cf0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1d00: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
1d30: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
1d40: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
1d50: 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20  y, *pPrevDirty; 
1d60: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
1d70: 73 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73  s */.  u32 notUs
1d80: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1d90: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1da0: 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20  space */.#ifdef 
1db0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1dc0: 45 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73  ES.  u32 pageHas
1dd0: 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70  h;.#endif.  /* p
1de0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1df0: 62 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61  bytes of page da
1e00: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68  ta follow this h
1e10: 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61  eader */.  /* Pa
1e20: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
1e30: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66   of local data f
1e40: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64  ollow the page d
1e50: 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ata */.};../*.**
1e60: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
1e70: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
1e80: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
1e90: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
1ea0: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
1eb0: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
1ec0: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
1ed0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
1ee0: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
1ef0: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
1f00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1f10: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
1f20: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1f30: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
1f40: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
1f50: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
1f60: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1f70: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
1f80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
1f90: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
1fa0: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
1fb0: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
1fc0: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
1fd0: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
1fe0: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
1ff0: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
2000: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
2010: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
2020: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
2030: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
2040: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
2050: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
2060: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
2070: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
2080: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
2090: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
20a0: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
20b0: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
20c0: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
20d0: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
20e0: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
20f0: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
2100: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
2110: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
2120: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
2130: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
2140: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2150: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
2160: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ment */.};../*.*
2170: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
2180: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
2190: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
21a0: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
21b0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
21c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
21d0: 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d  (P,D,N,X) if( P-
21e0: 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d  >xCodec!=0 ){ P-
21f0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
2200: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
2210: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
2220: 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29  ,D,N,X) ((char*)
2230: 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d  (P->xCodec!=0?P-
2240: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
2250: 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a  cArg,D,N,X):D)).
2260: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
2270: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f  ODEC1(P,D,N,X) /
2280: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
2290: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
22a0: 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23  ,X) ((char*)D).#
22b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
22c0: 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74  vert a pointer t
22d0: 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61  o a PgHdr into a
22e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20   pointer to its 
22f0: 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b  data.** and back
2300: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69   again..*/.#defi
2310: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ne PGHDR_TO_DATA
2320: 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28  (P)  ((void*)(&(
2330: 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  P)[1])).#define 
2340: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29  DATA_TO_PGHDR(D)
2350: 20 20 28 26 28 28 50 67 48 64 72 2a 29 28 44 29    (&((PgHdr*)(D)
2360: 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50  )[-1]).#define P
2370: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c  GHDR_TO_EXTRA(G,
2380: 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68  P) ((void*)&((ch
2390: 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28  ar*)(&(G)[1]))[(
23a0: 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23  P)->pageSize]).#
23b0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
23c0: 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20  HIST(P,PGR)  \. 
23d0: 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67 48             ((PgH
23e0: 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a  istory*)&((char*
23f0: 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52  )(&(P)[1]))[(PGR
2400: 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52  )->pageSize+(PGR
2410: 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a  )->nExtra])../*.
2420: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
2430: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
2440: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2450: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
2460: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
2470: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
2480: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
2490: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
24a0: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
24b0: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
24c0: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
24d0: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
24e0: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
24f0: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
2500: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
2510: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
2520: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
2530: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
2540: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
2550: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
2560: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
2570: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
2580: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
2590: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
25a0: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
25b0: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
25c0: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
25d0: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
25e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
25f0: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
2600: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
2610: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
2620: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
2630: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f  successfully..*/
2640: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
2650: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
2660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2670: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
2680: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2690: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
26a0: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
26b0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
26c0: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
26d0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
26e0: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
26f0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2700: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
2710: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
2720: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2730: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2750: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
2760: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
2770: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
2780: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2790: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
27a0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
27b0: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
27c0: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e0: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
27f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
2800: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
2810: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
2820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2830: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
2840: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
2850: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
2860: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2880: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
2890: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
28a0: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
28d0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
28e0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
28f0: 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f 66  s */.  u8 full_f
2900: 73 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  sync;           
2910: 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c     /* Use F_FULL
2920: 46 53 59 4e 43 20 77 68 65 6e 20 61 76 61 69 6c  FSYNC when avail
2930: 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 61  able */.  u8 sta
2940: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2950: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2960: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2970: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2980: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
29b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
29c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
29d0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
29e0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
29f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
2a00: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
2a10: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2a20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a30: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
2a40: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
2a50: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2a60: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
2a70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a80: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
2a90: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
2aa0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2ab0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
2ac0: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
2ad0: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
2ae0: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
2af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b00: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
2b10: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
2b20: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  I/O */.  u8 setM
2b30: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
2b40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b50: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
2b60: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
2b70: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
2b80: 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  tSync;          
2b90: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
2ba0: 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20   While true, do 
2bb0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
2bc0: 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c  che */.  u8 excl
2bd0: 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20  usiveMode;      
2be0: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
2bf0: 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67   True if locking
2c00: 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45  _mode==EXCLUSIVE
2c10: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
2c20: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
2c30: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
2c40: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2c50: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
2c60: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2c90: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2ca0: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
2cb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2cc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cd0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
2ce0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
2cf0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2d00: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
2d10: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2d20: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
2d30: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
2d40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2d50: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
2d60: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
2d70: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
2d80: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2da0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2db0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2dc0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2dd0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
2de0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
2df0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
2e00: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
2e10: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
2e20: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2e30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2e40: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2e50: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2e60: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2e80: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2e90: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2ea0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2eb0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ed0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2ee0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
2ef0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2f00: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2f10: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
2f20: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
2f30: 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20  int nMaxPage;   
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2f50: 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f  igh water mark o
2f60: 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  f nPage */.  int
2f70: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f90: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2fa0: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
2fb0: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
2fc0: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2fe0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2ff0: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
3000: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  ache */.  u8 *aI
3010: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
3020: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
3030: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
3040: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3050: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
3060: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
3070: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
3080: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3090: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
30a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
30b0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
30c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
30d0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
30e0: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
3110: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
3120: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
3130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
3140: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
3150: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
3160: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69   files */.  OsFi
3170: 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20  le *fd, *jfd;   
3180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3190: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
31a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
31b0: 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  rnal */.  OsFile
31c0: 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20   *stfd;         
31d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
31e0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
31f0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3200: 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61  urnal*/.  BusyHa
3210: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
3220: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
3230: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
3240: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64  andler */.  PgHd
3250: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
3260: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
3270: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
3280: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
3290: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
32a0: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
32b0: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
32c0: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
32d0: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
32e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
32f0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
3300: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
3310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3320: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
3330: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3340: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3350: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3370: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72   List of all dir
3380: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36  ty pages */.  i6
3390: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
33a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
33b0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
33c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
33d0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
33e0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
33f0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
3400: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
3410: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3420: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3430: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3440: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3450: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3460: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3470: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3480: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3490: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
34a0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
34b0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
34c0: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
34e0: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
34f0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3500: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3520: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3530: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3540: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3550: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3560: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3570: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3580: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3590: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
35a0: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
35b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
35c0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
35d0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
35e0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
35f0: 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b  r)(DbPage*,int);
3600: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
3610: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
3620: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
3630: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
3640: 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20  DbPage*,int);   
3650: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
3660: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
3670: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
3680: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
3690: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
36a0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
36b0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
36c0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
36d0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
36e0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
36f0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
3700: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3710: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3720: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61  #endif.  int nHa
3730: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
3740: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3750: 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74  the pager hash t
3760: 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  able */.  PgHdr 
3770: 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20  **aHash;        
3780: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
3790: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
37a0: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
37b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
37c0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
37d0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65  ANAGEMENT.  Page
37e0: 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  r *pNext;       
37f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65          /* Linke
3800: 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73  d list of pagers
3810: 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64 20   in this thread 
3820: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
3830: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
3840: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
3850: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
3860: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
3870: 20 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 69 43   use */.  u32 iC
3880: 68 61 6e 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  hangeCount;     
3890: 20 20 20 20 20 20 2f 2a 20 44 62 20 63 68 61 6e        /* Db chan
38a0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge-counter for w
38b0: 68 69 63 68 20 63 61 63 68 65 20 69 73 20 76 61  hich cache is va
38c0: 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lid */.};../*.**
38d0: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
38e0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
38f0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
3900: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
3910: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
3920: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3930: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3940: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3950: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3960: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3970: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  dif../*.** Journ
3980: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3990: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
39a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
39b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
39c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
39d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
39e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
39f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
3a00: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
3a10: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
3a20: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3a30: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3a40: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3a50: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3a60: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3a70: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3a80: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3a90: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3aa0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3ab0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3ac0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3ad0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
3ae0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
3af0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3b00: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3b10: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
3b20: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3b30: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3b40: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3b50: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3b60: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3b70: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3b80: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3b90: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3ba0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3bb0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3bc0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3bd0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3be0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3bf0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3c00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3c10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3c20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3c30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3c40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3c50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3c60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3c70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3c80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3c90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3ca0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3cb0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3cc0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3cd0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3ce0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3cf0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3d00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3d10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3d20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3d30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3d40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3d50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3d60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3d70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3d80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3d90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3da0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3db0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3dc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3dd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3de0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3df0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3e00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3e10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3e20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3e30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3e40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3e50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3e60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3e70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3e80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3e90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3ea0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3eb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3ec0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3ed0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3ee0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
3ef0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
3f00: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
3f10: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
3f20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
3f30: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
3f40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3f50: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3f60: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3f70: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3f80: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3fa0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3fb0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3fc0: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3fd0: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3fe0: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
3ff0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
4000: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
4010: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
4020: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
4030: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
4040: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
4050: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
4060: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
4070: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4080: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
4090: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
40a0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
40b0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
40c0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
40d0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
40e0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
40f0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4100: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4110: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4120: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4130: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
4140: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
4150: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
4160: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
4170: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
4180: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
4190: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
41a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
41b0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
41c0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
41d0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
41e0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
41f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
4200: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
4210: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
4220: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
4230: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4240: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4250: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4260: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4270: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4280: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4290: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
42a0: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
42b0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
42c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
42d0: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
42e0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
42f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
4300: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
4310: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
4320: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
4330: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4340: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4350: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4360: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4370: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4380: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4390: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
43a0: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
43b0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
43c0: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
43d0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
43e0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
43f0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
4400: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4410: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4420: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4430: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4440: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4450: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4460: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4470: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4480: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4490: 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  UG.  int pager3_
44a0: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
44b0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
44c0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
44d0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
44e0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
44f0: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
4500: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4510: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
4520: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4530: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
4540: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
4550: 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d  nRef=%-3d total=
4560: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
4570: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
4580: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
4590: 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  , p->pPager->nRe
45a0: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
45b0: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
45c0: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
45d0: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
45e0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
45f0: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
4600: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
4610: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
4620: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4630: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
4640: 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  of the pager has
4650: 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e  h table to N.  N
4660: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
4670: 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73  .** of two..*/.s
4680: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
4690: 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
46a0: 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
46b0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64  , int N){.  PgHd
46c0: 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b  r **aHash, *pPg;
46d0: 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26  .  assert( N>0 &
46e0: 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29  & (N&(N-1))==0 )
46f0: 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69  ;.  aHash = sqli
4700: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
4710: 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a  (aHash[0])*N );.
4720: 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29    if( aHash==0 )
4730: 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65  {.    /* Failure
4740: 20 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f   to rehash is no
4750: 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20  t an error.  It 
4760: 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72  is only a perfor
4770: 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20  mance hit. */.  
4780: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4790: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
47a0: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
47b0: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a  ger->nHash = N;.
47c0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
47d0: 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  = aHash;.  for(p
47e0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
47f0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
4800: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e  NextAll){.    in
4810: 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67  t h;.    if( pPg
4820: 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
4830: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
4840: 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
4850: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
4860: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  0 );.      conti
4870: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
4880: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
4890: 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  N-1);.    pPg->p
48a0: 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68  NextHash = aHash
48b0: 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61  [h];.    if( aHa
48c0: 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61  sh[h] ){.      a
48d0: 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
48e0: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
48f0: 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70      aHash[h] = p
4900: 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72  Pg;.    pPg->pPr
4910: 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a  evHash = 0;.  }.
4920: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
4930: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
4940: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
4950: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4960: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
4970: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
4980: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
4990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
49a0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
49b0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
49c0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
49d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
49e0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
49f0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
4a00: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
4a10: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
4a20: 74 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46  t read32bits(OsF
4a30: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52  ile *fd, u32 *pR
4a40: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
4a50: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
4a60: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
4a70: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
4a80: 65 6f 66 28 61 63 29 29 3b 0a 20 20 69 66 28 20  eof(ac));.  if( 
4a90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4aa0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 28 61 63  .    *pRes = (ac
4ab0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4ac0: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4ad0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d  <8) | ac[3];.  }
4ae0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4af0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4b00: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4b10: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
4b20: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
4b30: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
4b40: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 33  static void put3
4b50: 32 62 69 74 73 28 63 68 61 72 20 2a 61 63 2c 20  2bits(char *ac, 
4b60: 75 33 32 20 76 61 6c 29 7b 0a 20 20 61 63 5b 30  u32 val){.  ac[0
4b70: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
4b80: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
4b90: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
4ba0: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
4bb0: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
4bc0: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
4bd0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  f;.}../*.** Writ
4be0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
4bf0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
4c00: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4c10: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4c20: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4c30: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4c40: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4c50: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4c60: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4c70: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4c80: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  d, u32 val){.  c
4c90: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4ca0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4cb0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4cc0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4cd0: 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   4);.}../*.** Re
4ce0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
4cf0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f  ger at offset 'o
4d00: 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20  ffset' from the 
4d10: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
4d20: 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65  by.** page heade
4d30: 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  r 'p'..*/.static
4d40: 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62   u32 retrieve32b
4d50: 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e  its(PgHdr *p, in
4d60: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
4d70: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
4d80: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
4d90: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
4da0: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
4db0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63  t];.  return (ac
4dc0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4dd0: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4de0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a  <8) | ac[3];.}..
4df0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
4e00: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
4e10: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72  alled when an er
4e20: 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
4e30: 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  n the pager.** c
4e40: 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  ode. The first a
4e50: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
4e60: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
4e70: 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
4e80: 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65  .** second the e
4e90: 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
4ea0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
4eb0: 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
4ec0: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20  nction. .** The 
4ed0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
4ee0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
4ef0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4f00: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
4f10: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
4f20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4f30: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
4f40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
4f50: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
4f60: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
4f70: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
4f80: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
4f90: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
4fa0: 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20  s Pager.** will 
4fb0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
4fc0: 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
4fd0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
4fe0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
4ff0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
5000: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
5010: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
5020: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5030: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
5040: 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65  TE_FULL || pPage
5050: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
5060: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a 20  TE_OK );.  if(. 
5070: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46     rc2==SQLITE_F
5080: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ULL ||.    rc2==
5090: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a  SQLITE_IOERR ||.
50a0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
50b0: 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20  CORRUPT.  ){.   
50c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
50d0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74   = rc;.  }.  ret
50e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
50f0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
5100: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
5110: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
5120: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
5130: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
5140: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
5150: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
5160: 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68 61  pPage){.  u32 ha
5170: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
5180: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5190: 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67   *pData = (unsig
51a0: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
51b0: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 3b  _TO_DATA(pPage);
51c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
51d0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
51e0: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
51f0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69 29   hash = (hash+i)
5200: 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20  ^pData[i];.  }. 
5210: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
5220: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
5230: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
5240: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
5250: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
5260: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
5270: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
5280: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
5290: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
52a0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
52b0: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
52c0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
52d0: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
52e0: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
52f0: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
5300: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
5310: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
5320: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
5330: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
5340: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
5350: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
5360: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
5370: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
5380: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
5390: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
53a0: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
53b0: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
53c0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
53d0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
53e0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
53f0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
5400: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
5410: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
5420: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5430: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
5440: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
5450: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
5460: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
5480: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
5490: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
54a0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
54b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
54c0: 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61  eMalloc(). *pzMa
54d0: 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74  ster is.** set t
54e0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d  o point at the m
54f0: 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
5500: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
5510: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
5520: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70   sqliteFree() *p
5530: 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  zMaster..**.** I
5540: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
5550: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
5560: 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74   present *pzMast
5570: 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  er is set to 0 a
5580: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
5590: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
55a0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
55b0: 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65  erJournal(OsFile
55c0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a   *pJrnl, char **
55d0: 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  pzMaster){.  int
55e0: 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a   rc;.  u32 len;.
55f0: 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32    i64 szJ;.  u32
5600: 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b   cksum;.  int i;
5610: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5620: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5630: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5640: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5650: 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72   */..  *pzMaster
5660: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
5670: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
5680: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
5690: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
56a0: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
56b0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
56c0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
56d0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20  Jrnl, szJ-16);. 
56e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
56f0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5700: 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62   .  rc = read32b
5710: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29  its(pJrnl, &len)
5720: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5730: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5740: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5750: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b  2bits(pJrnl, &ck
5760: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
5770: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5780: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5790: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
57a0: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a  nl, aMagic, 8);.
57b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
57c0: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
57d0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
57e0: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
57f0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
5800: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
5810: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20  , szJ-16-len);. 
5820: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5830: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5840: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
5850: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
5860: 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66  loc(len+1);.  if
5870: 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a  ( !*pzMaster ){.
5880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5890: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
58a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
58b0: 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74  d(pJrnl, *pzMast
58c0: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
58d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
58e0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
58f0: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
5900: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
5910: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5920: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
5930: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
5940: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
5950: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
5960: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
5970: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
5980: 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b   -= (*pzMaster)[
5990: 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  i];.  }.  if( ck
59a0: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
59b0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
59c0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
59d0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
59e0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
59f0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
5a00: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
5a10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
5a20: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
5a30: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
5a40: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
5a50: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
5a60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5a70: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
5a80: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
5a90: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
5aa0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
5ab0: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5ac0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5ad0: 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  er = 0;.  }else{
5ae0: 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29  .    (*pzMaster)
5af0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
5b00: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
5b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5b20: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
5b30: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
5b40: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
5b50: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
5b60: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
5b70: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
5b80: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
5b90: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
5ba0: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
5bb0: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
5bc0: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
5bd0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
5be0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
5bf0: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
5c00: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
5c10: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
5cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
5ce0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5cf0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
5d00: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
5d10: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
5d20: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
5d30: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
5d40: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
5d50: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5d60: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5d70: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5d80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5d90: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5da0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5dc0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5dd0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5de0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5df0: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
5e00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
5e10: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
5e20: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
5e30: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5e40: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
5e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5e60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5e70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5e80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5e90: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
5ea0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5eb0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5ec0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5ed0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5ee0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5ef0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5f00: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5f10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5f20: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5f30: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5f40: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
5f50: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
5f60: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
5f70: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
5f80: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
5f90: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
5fa0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5fb0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5fc0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5fd0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5fe0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5ff0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
6000: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
6010: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
6020: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
6030: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
6040: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a  is journal..** .
6050: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
6060: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
6070: 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e   24) bytes of un
6080: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
6090: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
60a0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
60b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72  *pPager){.  char
60c0: 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
60d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
60e0: 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  6];.  int rc;.. 
60f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
6100: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
6110: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
6120: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
6130: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a  ournalOff;.  }..
6140: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6150: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6160: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6170: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
6180: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
6190: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
61a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
61b0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
61c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
61d0: 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a  ..  /* FIX ME: .
61e0: 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62    **.  ** Possib
61f0: 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e  ly for a pager n
6200: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
6210: 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
6220: 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74  magic should not
6230: 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
6240: 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66   until nRec is f
6250: 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74  illed in as part
6260: 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75   of next syncJou
6270: 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20  rnal(). .  **.  
6280: 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62  ** Actually mayb
6290: 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  e the whole jour
62a0: 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c  nal header shoul
62b0: 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74  d be delayed unt
62c0: 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69  il that.  ** poi
62d0: 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  nt. Think about 
62e0: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  this..  */.  mem
62f0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
6300: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6310: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6320: 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65  ));.  /* The nRe
6330: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
6340: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
6350: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70  journals. */.  p
6360: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6370: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6380: 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
6390: 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
63a0: 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a  fffff : 0);.  /*
63b0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
63c0: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
63d0: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
63e0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
63f0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
6400: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
6410: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
6420: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6430: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6440: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
6450: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6460: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
6470: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
6480: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6490: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
64a0: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
64b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
64c0: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
64d0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
64e0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
64f0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
6500: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6510: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
6520: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6530: 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ize);.  IOTRACE(
6540: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
6550: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
6560: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6570: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
6580: 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ))).  rc = sqlit
6590: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
65a0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
65b0: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
65c0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
65d0: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
65e0: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
65f0: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
6600: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
6610: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6620: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6630: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6640: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
6650: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6660: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
6670: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
6680: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
6690: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
66a0: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
66b0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
66c0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
66d0: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
66e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
66f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
6700: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6710: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  e(pPager->jfd, "
6720: 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d  \000", 1);.    }
6730: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6750: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6760: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
6770: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
6780: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
6790: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
67a0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
67b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
67c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
67d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
67e0: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
67f0: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
6800: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
6810: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
6820: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
6830: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6840: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
6850: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
6860: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
6870: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
6880: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
6890: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
68a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
68b0: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
68c0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
68d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
68e0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
68f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
6900: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
6910: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
6920: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
6930: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
6940: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6950: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
6960: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6970: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
6980: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
6990: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
69a0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
69b0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
69c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
69d0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
69e0: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
69f0: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
6a00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
6a10: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
6a20: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
6a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
6a40: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
6a50: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
6a60: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
6a70: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
6a80: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
6a90: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
6aa0: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
6ab0: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
6ac0: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
6ad0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
6ae0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
6af0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
6b00: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20  header */..  rc 
6b10: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6b20: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
6b30: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6b40: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6b50: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
6b60: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6b70: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
6b80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6b90: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6ba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
6bb0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
6bc0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
6bd0: 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20  aMagic));.  if( 
6be0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6bf0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
6c00: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
6c10: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
6c20: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
6c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6c40: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  E;.  }..  rc = r
6c50: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6c60: 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20  ->jfd, pNRec);. 
6c70: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6c80: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6c90: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6ca0: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
6cb0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
6cc0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6cd0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6ce0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6cf0: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
6d00: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6d10: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
6d20: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
6d30: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
6d40: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
6d50: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
6d60: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
6d70: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
6d80: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
6d90: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
6da0: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
6db0: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
6dc0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
6dd0: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
6de0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
6df0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
6e00: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
6e10: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
6e20: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
6e30: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
6e40: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
6e50: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
6e60: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6e70: 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a  ger->jfd, (u32 *
6e80: 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  )&pPager->sector
6e90: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
6ea0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6eb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6ec0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
6ed0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6ee0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6ef0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6f00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6f10: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
6f20: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
6f30: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
6f40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6f50: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
6f60: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
6f70: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
6f80: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6f90: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
6fa0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
6fb0: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
6fc0: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
6fd0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
6fe0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
6ff0: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
7000: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
7010: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
7020: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
7030: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
7040: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
7050: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
7060: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
7070: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
7080: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
7090: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
70a0: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
70b0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
70c0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
70d0: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
70e0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
70f0: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
7100: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
7110: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
7120: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
7130: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
7140: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
7150: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
7160: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
7170: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
7180: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
7190: 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
71a0: 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
71b0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
71c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
71d0: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
71e0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
71f0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
7200: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
7210: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
7220: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
7230: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
7240: 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a  len; .  int i; .
7250: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
7260: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
7270: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7280: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
7290: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
72a0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
72b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
72d0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
72e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
72f0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
7300: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
7310: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
7320: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
7330: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
7340: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
7350: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
7360: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
7370: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
7380: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7390: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
73a0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
73b0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
73c0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
73d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
73e0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
73f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
7400: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
7410: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
7420: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
7430: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7450: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7460: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
7470: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
7480: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7490: 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  d, PAGER_MJ_PGNO
74a0: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
74b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
74d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
74e0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
74f0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
7500: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7510: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7520: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
7530: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
7540: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
7550: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
7560: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
7570: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7580: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7590: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
75a0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
75b0: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
75c0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
75d0: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  ));.  pPager->ne
75e0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
75f0: 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75  ->noSync;.  retu
7600: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7610: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
7620: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
7630: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
7640: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
7650: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
7660: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
7670: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
7680: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
7690: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
76a0: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
76b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
76c0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
76d0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
76e0: 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a  rStmtCommit().**
76f0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43   routine run MUC
7700: 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  H faster for the
7710: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
7720: 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e  re there are man
7730: 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65  y.** pages in me
7740: 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20  mory but only a 
7750: 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73  few are in the s
7760: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7780: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
7790: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
77a0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
77b0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
77c0: 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  r;.  if( pPg->in
77d0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
77e0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
77f0: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50  revStmt==0 && pP
7800: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  g->pNextStmt==0 
7810: 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  );.  pPg->pPrevS
7820: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  tmt = 0;.  if( p
7830: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
7840: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
7850: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
7860: 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
7870: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
7880: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67  r->pStmt;.  pPag
7890: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b  er->pStmt = pPg;
78a0: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
78b0: 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   1;.}.static voi
78c0: 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72  d page_remove_fr
78d0: 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  om_stmt_list(PgH
78e0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
78f0: 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72  !pPg->inStmt ) r
7900: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
7910: 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20  ->pPrevStmt ){. 
7920: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7930: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
7940: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
7950: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d   pPg->pPrevStmt-
7960: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67  >pNextStmt = pPg
7970: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7990: 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
79a0: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
79b0: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
79c0: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
79d0: 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Stmt;.  }.  if( 
79e0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29  pPg->pNextStmt )
79f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7a00: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
7a10: 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  revStmt==pPg );.
7a20: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74      pPg->pNextSt
7a30: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
7a40: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a  pPg->pPrevStmt;.
7a50: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
7a60: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
7a70: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7a80: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
7a90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
7aa0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
7ab0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
7ac0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
7ad0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
7ae0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
7af0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
7b00: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
7b10: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
7b20: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
7b30: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
7b40: 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
7b50: 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
7b60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7b70: 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48    p = pPager->aH
7b80: 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67  ash[pgno & (pPag
7b90: 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20  er->nHash-1)];. 
7ba0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
7bb0: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
7bc0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
7bd0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
7be0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
7bf0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
7c00: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
7c10: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
7c20: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
7c30: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
7c40: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
7c50: 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  ){.    if( !MEMD
7c60: 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
7c70: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
7c80: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
7c90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
7ca0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
7cb0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
7cc0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
7cd0: 29 29 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  )).    }.    pPa
7ce0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
7cf0: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70  ER_UNLOCK;.    p
7d00: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
7d10: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
7d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
7d30: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
7d40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7d50: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
7d60: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
7d70: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  se file. This is
7d80: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
7d90: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
7da0: 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65  y entered.** the
7db0: 20 65 72 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f   error-state..*/
7dc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7dd0: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
7de0: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
7df0: 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 20   if( p->errCode 
7e00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7e10: 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
7e20: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
7e30: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  p->journalOpen==
7e40: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74  0 );.  if( p->st
7e50: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7e60: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7e70: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
7e80: 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  p);.  }.  pager_
7e90: 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73  unlock(p);.  ass
7ea0: 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20  ert( p->errCode 
7eb0: 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  || !p->journalOp
7ec0: 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73  en || (p->exclus
7ed0: 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75  iveMode&&!p->jou
7ee0: 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73  rnalOff) );.  as
7ef0: 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65  sert( p->errCode
7f00: 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e   || !p->stmtOpen
7f10: 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65   || p->exclusive
7f20: 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Mode );.}.../*.*
7f30: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
7f40: 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20  abase and clear 
7f50: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
7f60: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
7f70: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
7f80: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
7f90: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
7fa0: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
7fb0: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
7fc0: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
7fd0: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
7fe0: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
7ff0: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
8000: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
8010: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
8020: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
8030: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
8040: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8050: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
8060: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8070: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
8080: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
8090: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
80a0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
80b0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
80c0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
80d0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
80e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
80f0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
8100: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
8110: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8120: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8130: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
8140: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
8150: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
8160: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  >pAll = 0;.  pPa
8170: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
8180: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
8190: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
81a0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
81b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
81c0: 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  h = 0;.  pPager-
81d0: 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nRef = 0;.}../*
81e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
81f0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
8200: 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74  ion.  A transact
8210: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20  ion is ended by 
8220: 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d  either.** a COMM
8230: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
8240: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
8250: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8260: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
8270: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
8280: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
8290: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
82a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
82b0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
82c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
82d0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20   release.** the 
82e0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
82f0: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
8300: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
8310: 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73  place if that is
8320: 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
8330: 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e  ate thing to do.
8340: 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20    Release locks 
8350: 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f  usually is appro
8360: 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73  priate,.** unles
8370: 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  s we are in excl
8380: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
8390: 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73  e or unless this
83a0: 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54   is a .** COMMIT
83b0: 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f   AND BEGIN or RO
83c0: 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e  LLBACK AND BEGIN
83d0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
83e0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
83f0: 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c  le is either del
8400: 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65  eted or truncate
8410: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
8420: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
8430: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8440: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
8450: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
8460: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
8470: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
8480: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
8490: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
84a0: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
84b0: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
84c0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
84d0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
84e0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
84f0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
8500: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
8510: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8520: 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  ;.  int rc2 = SQ
8530: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
8540: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
8550: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
8560: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
8570: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8580: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
8590: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
85a0: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
85b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
85c0: 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72  tOpen && !pPager
85d0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
85e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
85f0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
8600: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
8610: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
8620: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
8630: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
8640: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8650: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
8660: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63            && (rc
8670: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
8680: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
8690: 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , 0))==SQLITE_OK
86a0: 20 29 7b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   ){;.      sqlit
86b0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
86c0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
86d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
86e0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
86f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
8700: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
8710: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8720: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
8730: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70  r->jfd);.      p
8740: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
8750: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  en = 0;.      if
8760: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8770: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8780: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8790: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
87a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
87b0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
87c0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
87d0: 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
87e0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
87f0: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
8800: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
8810: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
8820: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
8830: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
8840: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
8850: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
8860: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
8870: 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73       pPg->always
8880: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69  Rollback = 0;.#i
8890: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
88a0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
88b0: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
88c0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
88d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
88e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
88f0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
8900: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
8910: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
8920: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
8930: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
8940: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
8950: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
8960: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
8970: 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
8980: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
8990: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  =0 );.  }..  if(
89a0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
89b0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
89c0: 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  c2 = sqlite3OsUn
89d0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
89e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
89f0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
8a00: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
8a10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
8a20: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
8a30: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
8a40: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
8a50: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
8a60: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
8a70: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
8a80: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
8a90: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
8aa0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8ab0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8ac0: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
8ad0: 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65  >pFirst;.  pPage
8ae0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
8af0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
8b00: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
8b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8b20: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
8b30: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
8b40: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
8b50: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
8b60: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
8b70: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
8b80: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
8b90: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
8ba0: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
8bb0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8bc0: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
8bd0: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
8be0: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
8bf0: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
8c00: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
8c10: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
8c20: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
8c30: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
8c40: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
8c50: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
8c60: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
8c70: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
8c80: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
8c90: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
8ca0: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
8cb0: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
8cc0: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
8cd0: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
8ce0: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
8cf0: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
8d00: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
8d10: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
8d20: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
8d30: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
8d40: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
8d50: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
8d60: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
8d70: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
8d80: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
8d90: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
8da0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
8db0: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
8dc0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
8dd0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
8de0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
8df0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
8e00: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
8e10: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
8e20: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
8e30: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
8e40: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
8e50: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
8e60: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
8e70: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
8e80: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
8e90: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
8ea0: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
8eb0: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
8ec0: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
8ed0: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
8ee0: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
8ef0: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
8f00: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
8f10: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
8f20: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
8f30: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
8f40: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
8f50: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
8f60: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
8f70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
8f80: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
8f90: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
8fa0: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
8fb0: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
8fc0: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
8fd0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
8fe0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
8ff0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
9000: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
9010: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
9020: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
9030: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
9040: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9050: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
9060: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
9070: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
9080: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
9090: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
90a0: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
90b0: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
90c0: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
90d0: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
90e0: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
90f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9100: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
9110: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
9120: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
9130: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
9140: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
9150: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
9160: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
9170: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
9180: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75  File *jfd, int u
9190: 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  seCksum){.  int 
91a0: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
91b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91c0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
91d0: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
91e0: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
91f0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
9200: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
9210: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
9220: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
9230: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
9260: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
9270: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
9280: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  *aData = (u8 *)p
9290: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
92a0: 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ;   /* Temp stor
92b0: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
92c0: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
92d0: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
92e0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
92f0: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
9300: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
9310: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
9320: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
9330: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
9340: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9350: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
9360: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
9370: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
9380: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
9390: 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  a );..  rc = rea
93a0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
93b0: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
93c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
93d0: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
93e0: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
93f0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
9400: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
9410: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9420: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
9430: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9440: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
9450: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
9460: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
9470: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
9480: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
9490: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
94a0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
94b0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
94c0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
94d0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
94e0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
94f0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
9500: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
9510: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
9520: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
9530: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
9540: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
9550: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
9560: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
9570: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
9580: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
9590: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
95a0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
95b0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
95c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
95d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
95e0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
95f0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
9600: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9610: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
9620: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
9630: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9640: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
9650: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9660: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
9670: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
9680: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
9690: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
96a0: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
96b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
96c0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
96d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
96e0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
96f0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
9700: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9710: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
9720: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
9730: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
9740: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
9750: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
9760: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
9770: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
9780: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
9790: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
97a0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
97b0: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
97c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
97d0: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
97e0: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
97f0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
9800: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
9810: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
9820: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
9830: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
9840: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
9850: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
9860: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
9870: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
9880: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
9890: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
98a0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
98b0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
98c0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
98d0: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
98e0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
98f0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
9900: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
9910: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
9920: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
9930: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
9940: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
9950: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
9960: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
9970: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
9980: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9990: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
99a0: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
99b0: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
99c0: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
99d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
99e0: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
99f0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
9a00: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
9a10: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
9a20: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
9a30: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
9a40: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
9a50: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
9a60: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
9a70: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
9a80: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
9a90: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
9aa0: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
9ab0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
9ac0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
9ad0: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
9ae0: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
9af0: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
9b00: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
9b10: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
9b20: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
9b30: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
9b40: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9b50: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
9b60: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
9b70: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
9b80: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
9b90: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
9ba0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
9bb0: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
9bc0: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
9bd0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
9be0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
9bf0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
9c00: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
9c10: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
9c20: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
9c30: 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 50 41  | pPg!=0 );.  PA
9c40: 47 45 52 54 52 41 43 45 33 28 22 50 4c 41 59 42  GERTRACE3("PLAYB
9c50: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ACK %d page %d\n
9c60: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
9c70: 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  r), pgno);.  if(
9c80: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9c90: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9ca0: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
9cb0: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20  g->needSync==0) 
9cc0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9cd0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
9ce0: 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
9cf0: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
9d00: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
9d10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9d20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9d30: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9d40: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
9d50: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9d60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
9d70: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
9d80: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
9d90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
9da0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
9db0: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
9dc0: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
9dd0: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
9de0: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
9df0: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
9e00: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
9e10: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
9e20: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
9e30: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
9e40: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
9e50: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
9e60: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
9e70: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
9e80: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
9e90: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
9ea0: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
9eb0: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
9ec0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
9ed0: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
9ee0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
9ef0: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
9f00: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
9f10: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
9f20: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
9f30: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
9f40: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
9f50: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
9f60: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9f70: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
9f80: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
9f90: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
9fa0: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
9fb0: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
9fc0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
9fd0: 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50  structor(pPg, pP
9fe0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9ff0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
a000: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
a010: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
a020: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
a030: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
a040: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
a050: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
a060: 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20 20 20 20 2f  pgno, 3);..    /
a070: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
a080: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
a090: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
a0a0: 50 61 67 65 72 2e 69 43 68 61 6e 67 65 43 6f 75  Pager.iChangeCou
a0b0: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  nt */.    if( pg
a0c0: 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  no==1 ){.      p
a0d0: 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
a0e0: 75 6e 74 20 3d 20 72 65 74 72 69 65 76 65 33 32  unt = retrieve32
a0f0: 62 69 74 73 28 70 50 67 2c 20 32 34 29 3b 0a 20  bits(pPg, 24);. 
a100: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a110: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
a120: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
a130: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
a140: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a150: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
a160: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
a170: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
a180: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a190: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
a1a0: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
a1b0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
a1c0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
a1d0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
a1e0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a1f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
a200: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
a210: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
a220: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a230: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
a240: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
a250: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
a260: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
a270: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a280: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
a290: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
a2a0: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
a2b0: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
a2c0: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
a2d0: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
a2e0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
a2f0: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
a300: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
a310: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
a320: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
a330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a340: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
a350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
a360: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
a370: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
a380: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
a390: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
a3a0: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
a3b0: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
a3c0: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
a3d0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
a3e0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
a3f0: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
a400: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
a410: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
a420: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
a430: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
a440: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
a450: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
a460: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
a470: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
a480: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
a490: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
a4a0: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
a4b0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
a4c0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
a4d0: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
a4e0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
a4f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
a500: 6d 61 73 74 65 72 20 29 3b 0a 20 20 69 66 28 20  master );.  if( 
a510: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a520: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a530: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
a540: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
a550: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
a560: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
a570: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
a580: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a590: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a5a0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
a5b0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
a5c0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
a5d0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
a5e0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
a5f0: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
a600: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
a610: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
a620: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
a630: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
a640: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
a650: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
a660: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
a670: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
a680: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
a690: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
a6a0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a6b0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
a6c0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
a6d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
a6e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
a6f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
a700: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a710: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
a720: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
a730: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
a740: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
a750: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a760: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
a770: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
a780: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
a790: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
a7a0: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
a7b0: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
a7c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
a7d0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
a7e0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
a7f0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
a810: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
a820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
a830: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
a840: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
a850: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
a860: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
a870: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
a880: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
a890: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
a8a0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
a8b0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
a8c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
a8d0: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
a8e0: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
a8f0: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
a900: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
a910: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
a920: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
a930: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
a940: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72  QLITE_OK || jour
a950: 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  nal );.        i
a960: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
a980: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
a9a0: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
a9b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
a9c0: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
a9d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a9e0: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
a9f0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
aa00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
aa10: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
aa20: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
aa30: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
aa40: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
aa50: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
aa60: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
aa70: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
aa80: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
aa90: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
aaa0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
aab0: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
aac0: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
aad0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
aae0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
aaf0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ab00: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
ab10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ab20: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
ab30: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
ab40: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
ab50: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
ab60: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
ab70: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
ab80: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
ab90: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
aba0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
abb0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
abc0: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
abd0: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
abe0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
abf0: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
ac00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30  urn rc;.}..#if 0
ac10: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72  ./*.** Make ever
ac20: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  y page in the ca
ac30: 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77  che agree with w
ac40: 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20  hat is on disk. 
ac50: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
ac60: 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64  .** reread the d
ac70: 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65  isk to reset the
ac80: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61   state of the ca
ac90: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
aca0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
acb0: 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  d after a rollba
acc0: 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65  ck in which some
acd0: 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61   of the dirty ca
ace0: 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64  che.** pages had
acf0: 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
ad00: 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e  ten out to disk.
ad10: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
ad20: 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61  l back the.** ca
ad30: 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  che content and 
ad40: 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  the easiest way 
ad50: 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f  to do that is to
ad60: 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20   reread the old 
ad70: 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20  content.** back 
ad80: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a  from the disk..*
ad90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
ada0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
adb0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
adc0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
add0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ade0: 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  OK;.  for(pPg=pP
adf0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
ae00: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
ae10: 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ll){.    char *z
ae20: 42 75 66 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Buf = pPager->pT
ae30: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
ae40: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
ae50: 66 6f 72 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a  for one page */.
ae60: 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69      if( !pPg->di
ae70: 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rty ) continue;.
ae80: 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
ae90: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
aea0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
aeb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aec0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
aed0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
aee0: 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d  eSize*(i64)(pPg-
aef0: 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20  >pgno-1));.     
af00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
af10: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
af20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
af30: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
af40: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
af50: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
af60: 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
af70: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
af80: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
af90: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
afa0: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
afb0: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
afc0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
afd0: 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  zBuf, pPg->pgno,
afe0: 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   2);.    }else{.
aff0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
b000: 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  f, 0, pPager->pa
b010: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
b020: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
b030: 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42  ==0 || memcmp(zB
b040: 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  uf, PGHDR_TO_DAT
b050: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
b060: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
b070: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
b080: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
b090: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
b0a0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
b0b0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
b0c0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
b0d0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
b0e0: 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
b0f0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  eSize);.      }e
b100: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
b110: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
b120: 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
b130: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
b140: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
b150: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64   }.    pPg->need
b160: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
b170: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  g->dirty = 0;.#i
b180: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
b190: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
b1a0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
b1b0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
b1c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 50  .#endif.  }.  pP
b1d0: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
b1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b1f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
b200: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
b210: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
b220: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
b230: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
b240: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  ** indicated..*/
b250: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b260: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
b270: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
b280: 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
b290: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
b2a0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
b2b0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b2c0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b2d0: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
b2e0: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
b2f0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
b300: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
b310: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
b320: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
b330: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
b340: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
b350: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
b360: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
b370: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
b380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
b390: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
b3a0: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
b3b0: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
b3c0: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
b3d0: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
b3e0: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
b3f0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
b400: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
b410: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
b420: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
b430: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
b440: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
b450: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
b460: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
b470: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
b480: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
b490: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b4a0: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
b4b0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b4c0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b4d0: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
b4e0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
b4f0: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
b500: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
b510: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
b520: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
b530: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
b540: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
b550: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
b560: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
b570: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
b580: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
b590: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b5a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
b5b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
b5c0: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
b5d0: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
b5e0: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
b5f0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
b600: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
b610: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
b620: 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  6)  N bytes of t
b630: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b640: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
b650: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
b660: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
b670: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
b680: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
b690: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
b6a0: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
b6b0: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
b6c0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
b6d0: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
b6e0: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
b6f0: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
b700: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
b710: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
b720: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
b730: 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (7)  Zero or mor
b740: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
b750: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
b760: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
b770: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
b780: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
b790: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
b7a0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
b7b0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
b7c0: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
b7d0: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
b7e0: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
b7f0: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
b800: 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74  n the first 6 it
b810: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
b820: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
b830: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
b840: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74  stance of the 7t
b850: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
b860: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
b870: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
b880: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
b890: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
b8a0: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
b8b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
b8c0: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
b8d0: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
b8e0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
b8f0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
b900: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
b910: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b920: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
b930: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
b940: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
b950: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
b960: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
b970: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
b980: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
b990: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b9a0: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
b9b0: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
b9c0: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
b9d0: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
b9e0: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
b9f0: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
ba00: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
ba10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
ba20: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
ba30: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
ba40: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
ba50: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
ba60: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
ba70: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
ba80: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
ba90: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
baa0: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
bab0: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
bac0: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
bad0: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
bae0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
baf0: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
bb00: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
bb10: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
bb20: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
bb30: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
bb40: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
bb50: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
bb60: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
bb70: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
bb80: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
bb90: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
bba0: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
bbb0: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
bbc0: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
bbd0: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
bbe0: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
bbf0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
bc00: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
bc10: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
bc20: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
bc30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
bc40: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
bc50: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
bc60: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
bc70: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
bc80: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
bc90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
bca0: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
bcb0: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
bcc0: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
bcd0: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
bce0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
bcf0: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
bd00: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
bd10: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
bd20: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
bd30: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
bd40: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
bd50: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
bd60: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
bd70: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
bd80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
bd90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bda0: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
bdb0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
bdc0: 6f 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  ot){.  i64 szJ; 
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
bdf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
be00: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
be10: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
be20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
be30: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
be40: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
be50: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
be60: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
be70: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
be80: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
be90: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
bea0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
beb0: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
bec0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
bed0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
bee0: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
bef0: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
bf00: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
bf10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
bf20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
bf30: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
bf40: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
bf50: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
bf60: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
bf70: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
bf80: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
bf90: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
bfa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
bfb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
bfc0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
bfd0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
bfe0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
bff0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c000: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
c010: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
c020: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
c030: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
c040: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
c050: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
c060: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
c070: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
c080: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c090: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
c0a0: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
c0b0: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
c0c0: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
c0d0: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
c0e0: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
c0f0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
c100: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
c110: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
c120: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
c130: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
c140: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
c150: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
c160: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
c170: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
c180: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
c190: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
c1a0: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
c1b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
c1c0: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
c1d0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
c1e0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
c1f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c200: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
c210: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
c220: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
c230: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
c240: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c250: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
c260: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
c270: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
c280: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
c290: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
c2a0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
c2b0: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
c2c0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
c2d0: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
c2e0: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
c2f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
c300: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
c310: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
c320: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
c330: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
c340: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
c350: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
c360: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
c370: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
c380: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
c390: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
c3a0: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
c3b0: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
c3c0: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
c3d0: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
c3e0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
c3f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
c400: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
c410: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
c420: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
c430: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c440: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
c450: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
c460: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c470: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c480: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
c490: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c4a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
c4b0: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
c4c0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
c4d0: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
c4e0: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
c4f0: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
c500: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
c510: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
c520: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
c530: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
c540: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
c550: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
c560: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
c570: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
c580: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
c590: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
c5a0: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
c5b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c5c0: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
c5d0: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
c5e0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
c5f0: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
c600: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
c610: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
c620: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
c630: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
c640: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
c650: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
c660: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
c670: 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
c680: 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
c690: 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
c6a0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
c6b0: 65 73 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ess. In this cas
c6c0: 65 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  e the rest of th
c6d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
c6e0: 6f 6e 73 69 73 74 73 20 6f 66 0a 20 20 20 20 2a  onsists of.    *
c6f0: 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70  * journalled cop
c700: 69 65 73 20 6f 66 20 70 61 67 65 73 20 74 68 61  ies of pages tha
c710: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 61  t need to be rea
c720: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
c730: 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
c740: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
c750: 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20   !isHot ){.     
c760: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
c770: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c780: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
c790: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
c7a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
c7b0: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
c7c0: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
c7d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
c7e0: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
c7f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
c800: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
c810: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
c820: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c830: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
c840: 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20  XCLUSIVE && .   
c850: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c860: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
c870: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c880: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c890: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
c8a0: 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ize==0 || pPager
c8b0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78  ->origDbSize==mx
c8c0: 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg );.      rc =
c8d0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
c8e0: 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
c8f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c900: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c910: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
c920: 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
c930: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
c940: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
c950: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
c960: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
c970: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
c980: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
c990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
c9a0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
c9b0: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
c9c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
c9d0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
c9e0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
c9f0: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
ca00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ca10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ca20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ca30: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
ca40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
ca50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
ca60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ca70: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
ca80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ca90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
caa0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
cab0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
cac0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
cad0: 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
cae0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
caf0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
cb00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cb10: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
cb20: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
cb30: 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
cb40: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
cb50: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
cb60: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
cb70: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
cb80: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
cb90: 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
cba0: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
cbb0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
cbc0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
cbd0: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
cbe0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cbf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
cc00: 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
cc10: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
cc20: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
cc30: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
cc40: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
cc50: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
cc60: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
cc70: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
cc80: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
cc90: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
cca0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
ccb0: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
ccc0: 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
ccd0: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
cce0: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
ccf0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
cd00: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
cd10: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
cd20: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
cd30: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
cd40: 2d 3e 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->fd);.  return 
cd50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
cd60: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
cd70: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
cd80: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
cd90: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
cda0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
cdb0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
cdc0: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
cdd0: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
cde0: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
cdf0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
ce00: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ce10: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
ce20: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
ce30: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
ce40: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
ce50: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
ce60: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ce70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
ce80: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
ce90: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
cea0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
ceb0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
cec0: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
ced0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
cee0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
cef0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
cf00: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
cf10: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
cf20: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
cf30: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
cf40: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
cf50: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
cf60: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
cf70: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
cf80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
cf90: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
cfa0: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
cfb0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
cfc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cfd0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
cfe0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d000: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
d010: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
d020: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
d030: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
d040: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
d050: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
d060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
d070: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
d080: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
d090: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d0a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
d0b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
d0c0: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
d0d0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
d0e0: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
d0f0: 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
d100: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
d110: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
d120: 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
d130: 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
d140: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
d150: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
d160: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
d170: 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
d180: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
d190: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
d1a0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
d1b0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
d1c0: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
d1d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
d1e0: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
d1f0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
d200: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
d210: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
d220: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
d230: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
d240: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
d250: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
d260: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
d270: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
d280: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
d290: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
d2a0: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
d2b0: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
d2c0: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
d2d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
d2e0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
d2f0: 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 70 50 61  _SHARED );.  pPa
d300: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
d310: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a  ager->stmtSize;.
d320: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
d330: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
d340: 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  s are in the sta
d350: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
d360: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d370: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
d380: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
d390: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
d3a0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
d3b0: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e  r->stfd, 0);.  n
d3c0: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
d3d0: 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
d3e0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
d3f0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
d400: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d410: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
d420: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d430: 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
d440: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
d450: 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
d460: 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
d470: 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
d480: 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
d490: 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
d4a0: 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
d4b0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
d4c0: 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
d4d0: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
d4e0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
d4f0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
d500: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
d510: 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
d520: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
d530: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d540: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d550: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d560: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d570: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  k;.  }..  /* Now
d580: 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73   roll some pages
d590: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74   back from the t
d5a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
d5b0: 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53  al. Pager.stmtJS
d5c0: 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65  ize.  ** was the
d5d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
d5e0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74  rnal file when t
d5f0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61  his statement wa
d600: 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20  s started, so.  
d610: 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66  ** everything af
d620: 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74  ter that needs t
d630: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
d640: 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  , either into th
d650: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
d660: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68   the memory cach
d670: 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  e, or both..  **
d680: 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  .  ** If it is n
d690: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61  ot zero, then Pa
d6a0: 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69  ger.stmtHdrOff i
d6b0: 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  s the offset to 
d6c0: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
d6d0: 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  f the first jour
d6e0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
d6f0: 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73  en during this s
d700: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
d710: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
d720: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
d730: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
d740: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
d750: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d760: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
d770: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d780: 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
d790: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
d7a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
d7b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  ;.  pPager->cksu
d7c0: 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  mInit = pPager->
d7d0: 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69  stmtCksum;.  whi
d7e0: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
d7f0: 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20  nalOff < hdrOff 
d800: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
d810: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
d820: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
d830: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
d840: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d850: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d860: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d870: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d880: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
d890: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
d8a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
d8b0: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a  zJ ){.    u32 nJ
d8c0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
d8d0: 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
d8e0: 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
d8f0: 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
d900: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
d910: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
d920: 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
d930: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d940: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d950: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d960: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d970: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
d980: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
d990: 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
d9a0: 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
d9b0: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
d9c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
d9d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d9e0: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
d9f0: 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e  or(i=nJRec-1; i>
da00: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
da10: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
da20: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
da30: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
da40: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
da50: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
da60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
da70: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
da80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
da90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
daa0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
dab0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
dac0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
dad0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
dae0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
daf0: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
db00: 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61  TE_OK) {.    pPa
db10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
db20: 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
db30: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
db40: 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
db50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
db60: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
db70: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
db80: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
db90: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
dba0: 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
dbb0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
dbc0: 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
dbd0: 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
dbe0: 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
dbf0: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
dc00: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
dc10: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
dc20: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
dc30: 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
dc40: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
dc50: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
dc60: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
dc70: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
dc80: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
dc90: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
dca0: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
dcb0: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
dcc0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
dcd0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
dce0: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
dcf0: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
dd00: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
dd10: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
dd20: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
dd30: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
dd40: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
dd50: 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
dd60: 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
dd70: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
dd80: 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
dd90: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
dda0: 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
ddb0: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
ddc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ddd0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
dde0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
ddf0: 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
de00: 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
de10: 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
de20: 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
de30: 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
de40: 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
de50: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
de60: 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
de70: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
de80: 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
de90: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
dea0: 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
deb0: 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
dec0: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
ded0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
dee0: 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
def0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
df00: 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
df10: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
df20: 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
df30: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
df40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
df50: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
df60: 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
df70: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
df80: 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
df90: 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
dfa0: 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
dfb0: 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
dfc0: 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
dfd0: 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
dff0: 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
e000: 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
e010: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
e020: 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
e030: 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
e040: 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
e050: 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
e060: 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
e070: 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
e080: 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
e090: 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
e0a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e0b0: 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
e0c0: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
e0d0: 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
e0e0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
e0f0: 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
e100: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
e110: 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
e120: 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
e130: 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
e140: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e150: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
e160: 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
e170: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
e180: 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
e190: 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
e1a0: 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a  nt full_fsync){.
e1b0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
e1c0: 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
e1d0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e1e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
e1f0: 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
e200: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
e210: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
e220: 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c  full_fsync = ful
e230: 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70  l_fsync;.  if( p
e240: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
e250: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
e260: 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
e270: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
e280: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
e290: 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
e2a0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
e2b0: 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
e2c0: 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
e2d0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
e2e0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
e2f0: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
e300: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
e310: 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
e320: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
e330: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
e340: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
e350: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
e360: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
e370: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72   file. .**.** Wr
e380: 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
e390: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
e3a0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
e3b0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
e3c0: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
e3d0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
e3e0: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
e3f0: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
e400: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
e410: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
e420: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
e430: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
e440: 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65   int sqlite3Page
e450: 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65  rOpentemp(OsFile
e460: 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63   **pFd){.  int c
e470: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
e480: 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53  ;.  char zFile[S
e490: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
e4a0: 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51  IZE];..#ifdef SQ
e4b0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
e4c0: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
e4d0: 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
e4e0: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
e4f0: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
e500: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20  #endif.  do{.   
e510: 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69   cnt--;.    sqli
e520: 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
e530: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
e540: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
e550: 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c  Exclusive(zFile,
e560: 20 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61 73   pFd, 1);.    as
e570: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e580: 5f 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20  _OK || *pFd );. 
e590: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
e5a0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
e5b0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
e5c0: 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
e5d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
e5e0: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
e5f0: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
e600: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
e610: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
e620: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
e630: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
e640: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
e650: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
e660: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
e670: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
e680: 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
e690: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
e6a0: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
e6b0: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
e6c0: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
e6d0: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ng sqlite3PagerU
e6e0: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
e6f0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
e700: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
e710: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
e720: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
e730: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
e740: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
e750: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
e760: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
e770: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
e780: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
e790: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
e7a0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
e7b0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
e7c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
e7d0: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
e7e0: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
e7f0: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
e800: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
e810: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
e820: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
e830: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
e840: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
e850: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
e860: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
e870: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
e880: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
e890: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e8a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
e8b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
e8c0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
e8d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
e8e0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
e8f0: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
e900: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
e910: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
e920: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
e930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
e940: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
e950: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  this file */.){.
e960: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
e970: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  = 0;.  char *zFu
e980: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a  llPathname = 0;.
e990: 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20    int nameLen;  
e9a0: 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77  /* Compiler is w
e9b0: 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c  rong. This is al
e9c0: 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
e9d0: 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20   before use */. 
e9e0: 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b   OsFile *fd = 0;
e9f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ea00: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
ea10: 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
ea20: 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
ea30: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
ea40: 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
ea50: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
ea60: 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
ea70: 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
ea80: 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
ea90: 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
eaa0: 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
eab0: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
eac0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
ead0: 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  E];.#ifdef SQLIT
eae0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
eaf0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
eb00: 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f  A malloc() canno
eb10: 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65  t fail in sqlite
eb20: 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73  3ThreadData() as
eb30: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c   one or more cal
eb40: 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c  ls to .  ** mall
eb50: 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61  oc() must have a
eb60: 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65  lready been made
eb70: 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20   by this thread 
eb80: 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20  before it gets. 
eb90: 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e   ** to this poin
eba0: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  t. This means th
ebb0: 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73  e ThreadData mus
ebc0: 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  t have been allo
ebd0: 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20  cated already.  
ebe0: 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61  ** so that Threa
ebf0: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e  dData.nAlloc can
ec00: 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c   be set. It woul
ec10: 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73  d be nice to ass
ec20: 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68  ert.  ** that Th
ec30: 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
ec40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74  is non-zero, but
ec50: 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b   alas this break
ec60: 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20  s test cases .  
ec70: 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e  ** written to in
ec80: 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64  voke the pager d
ec90: 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  irectly..  */.  
eca0: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
ecb0: 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
ecc0: 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74  Data();.  assert
ecd0: 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66  ( pTsd );.#endif
ece0: 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74  ..  /* We used t
ecf0: 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63  o test if malloc
ed00: 28 29 20 68 61 64 20 61 6c 72 65 61 64 79 20 66  () had already f
ed10: 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f  ailed before pro
ed20: 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42  ceeding. .  ** B
ed30: 75 74 20 74 68 65 20 77 61 79 20 74 68 69 73 20  ut the way this 
ed40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
ed50: 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73   in SQLite means
ed60: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a   that can never.
ed70: 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72    ** happen. Fur
ed80: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65  thermore, if the
ed90: 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
eda0: 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79 20 73  lag is already s
edb0: 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  et, .  ** either
edc0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
edd0: 69 74 65 53 74 72 44 75 70 28 29 20 6f 72 20 73  iteStrDup() or s
ede0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65  qliteMalloc() be
edf0: 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61  low will.  ** fa
ee00: 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53  il shortly and S
ee10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75  QLITE_NOMEM retu
ee20: 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a  rned anyway..  *
ee30: 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
ee40: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
ee50: 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
ee60: 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
ee70: 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
ee80: 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
ee90: 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
eea0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
eeb0: 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
eec0: 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
eed0: 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
eee0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
eef0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
ef00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef10: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
ef20: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
ef30: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
ef40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
ef50: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
ef60: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
ef70: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
ef80: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
ef90: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
efa0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
efb0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
efc0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
efd0: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
efe0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
eff0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f000: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
f010: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
f020: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
f030: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
f040: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66  !=SQLITE_OK || f
f050: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
f060: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
f070: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f080: 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a  rOpentemp(&fd);.
f090: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d      sqlite3OsTem
f0a0: 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29  pFileName(zTemp)
f0b0: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
f0c0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75  = zTemp;.    zFu
f0d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
f0e0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
f0f0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
f100: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65  E_OK ){.      te
f120: 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
f130: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
f140: 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73  cate the Pager s
f150: 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72  tructure. As par
f160: 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c  t of the same al
f170: 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61  location, alloca
f180: 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  te.  ** space fo
f190: 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73  r the full paths
f1a0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69   of the file, di
f1b0: 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72  rectory and jour
f1c0: 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72  nal .  ** (Pager
f1d0: 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65  .zFilename, Page
f1e0: 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64  r.zDirectory and
f1f0: 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29   Pager.zJournal)
f200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75  ..  */.  if( zFu
f210: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
f220: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
f230: 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
f240: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
f250: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
f260: 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
f270: 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29  nameLen*3 + 30 )
f280: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
f290: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
f2a0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
f2b0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28  r->pTmpSpace = (
f2c0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
f2d0: 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45  locRaw(SQLITE_DE
f2e0: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
f2f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
f300: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
f310: 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
f320: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
f330: 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d  bove, free the m
f340: 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e  emory .  ** poin
f350: 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50  ted to by zFullP
f360: 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68  athname, free th
f370: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
f380: 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
f390: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63  .  ** file. Sinc
f3a0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
f3b0: 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
f3c0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
f3d0: 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
f3e0: 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
f3f0: 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
f400: 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a  f( !pPager || !z
f410: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20  FullPathname || 
f420: 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
f430: 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  ce || rc!=SQLITE
f440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
f450: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
f460: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
f470: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f480: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
f490: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
f4a0: 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
f4b0: 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
f4c0: 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  rc);.  }..  PAGE
f4d0: 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
f4e0: 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
f4f0: 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
f500: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52  athname);.  IOTR
f510: 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
f520: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75  \n", pPager, zFu
f530: 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70  llPathname)).  p
f540: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f550: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
f560: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
f570: 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
f580: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
f590: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
f5a0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
f5b0: 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
f5c0: 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
f5d0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
f5e0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
f5f0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
f600: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  trcpy(pPager->zD
f610: 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50  irectory, zFullP
f620: 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72  athname);..  for
f630: 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20  (i=nameLen; i>0 
f640: 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
f650: 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
f660: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
f670: 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
f680: 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
f690: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
f6a0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c  ->zJournal, zFul
f6b0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71  lPathname);.  sq
f6c0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f6d0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
f6e0: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
f6f0: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
f700: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
f710: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
f720: 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
f730: 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
f740: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
f750: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
f760: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
f770: 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
f780: 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
f790: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f7a0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
f7b0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f7c0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
f7d0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f7e0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
f7f0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
f800: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
f810: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f820: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
f830: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
f840: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
f850: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f860: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
f870: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f880: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
f890: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f8a0: 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20  ->nMaxPage = 0; 
f8b0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
f8c0: 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73  age = 100;.  ass
f8d0: 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ert( PAGER_UNLOC
f8e0: 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61  K==0 );.  /* pPa
f8f0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
f900: 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
f910: 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
f920: 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
f930: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
f940: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
f950: 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
f960: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
f970: 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
f980: 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
f990: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
f9a0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
f9b0: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
f9c0: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
f9d0: 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
f9e0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
f9f0: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
fa00: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
fa10: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
fa20: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
fa30: 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
fa40: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
fa50: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
fa60: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
fa70: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
fa80: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
fa90: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
faa0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
fab0: 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  1);.  /* pPager-
fac0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
fad0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
fae0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
faf0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
fb00: 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
fb10: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
fb20: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
fb30: 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
fb40: 74 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20  t(fd||memDb);.  
fb50: 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
fb60: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
fb70: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
fb80: 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a  SectorSize(fd);.
fb90: 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
fba0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
fbb0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
fbc0: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
fbd0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
fbe0: 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
fbf0: 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
fc00: 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
fc10: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
fc20: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61  MANAGEMENT.  pPa
fc30: 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73  ger->pNext = pTs
fc40: 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73  d->pPager;.  pTs
fc50: 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  d->pPager = pPag
fc60: 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  er;.#endif.  ret
fc70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fc80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fc90: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
fca0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
fcb0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
fcc0: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
fcd0: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
fce0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
fcf0: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
fd00: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
fd10: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
fd20: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
fd30: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
fd40: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
fd50: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
fd60: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
fd70: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
fd80: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
fd90: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
fda0: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
fdb0: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
fdc0: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
fdd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
fde0: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
fdf0: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
fe00: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
fe10: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
fe20: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
fe30: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50   result sqlite3P
fe40: 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a  agerClose().  .*
fe50: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
fe60: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
fe70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
fe80: 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ef()..*/.void sq
fe90: 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73  lite3PagerSetDes
fea0: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
feb0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
fec0: 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  esc)(DbPage*,int
fed0: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44  )){.  pPager->xD
fee0: 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73  estructor = xDes
fef0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
ff00: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
ff10: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
ff20: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
ff30: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
ff40: 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77  r.** is called w
ff50: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
ff60: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63  of a page in cac
ff70: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
ff80: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a  o its original.*
ff90: 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73  * value as a res
ffa0: 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ult of a rollbac
ffb0: 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  k.  The callback
ffc0: 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65   gives higher-le
ffd0: 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f  vel code.** an o
ffe0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65  pportunity to re
fff0: 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20  store the EXTRA 
10000 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65  section to agree
10010 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
10020 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  ed.** page data.
10030 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10040 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
10050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10060 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
10070 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
10080 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
10090 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a  er = xReinit;.}.
100a0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
100b0 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72  age size.  Retur
100c0 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20  n the new size. 
100d0 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20   If the suggest 
100e0 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  new page.** size
100f0 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74   is inappropriat
10100 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72  e, then an alter
10110 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65  native page size
10120 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20   is selected.** 
10130 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  and returned..*/
10140 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
10150 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
10160 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
10170 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73  pageSize){.  ass
10180 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35  ert( pageSize>=5
10190 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
101a0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
101b0 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70  SIZE );.  if( !p
101c0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20  Pager->memDb && 
101d0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
101e0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
101f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
10200 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10210 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
10220 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10230 63 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c  ce = sqlite3Real
10240 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65 72  locOrFree(pPager
10250 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67  ->pTmpSpace, pag
10260 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65  eSize);.  }.  re
10270 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67  turn pPager->pag
10280 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
10290 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
102a0 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
102b0 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
102c0 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
102d0 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
102e0 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
102f0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
10300 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
10310 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
10320 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
10330 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
10340 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
10350 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
10360 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
10370 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
10380 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
10390 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
103a0 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
103b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
103c0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
103d0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
103e0 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
103f0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
10400 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
10410 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
10420 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10430 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
10440 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
10450 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10460 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
10470 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
10480 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
10490 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
104a0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
104b0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
104c0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
104d0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
104e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
104f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10500 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
10510 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
10520 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10530 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
10540 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
10550 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
10560 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
10570 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
10580 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
10590 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
105a0 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
105b0 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
105c0 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
105d0 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
105e0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
105f0 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
10600 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
10610 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
10620 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
10630 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
10640 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
10650 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
10660 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
10670 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
10680 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
10690 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
106a0 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
106b0 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
106c0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
106d0 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
106e0 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
106f0 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
10700 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
10710 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
10720 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
10730 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
10740 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
10750 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
10760 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10770 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
10780 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
10790 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b   if( MEMDB==0 ){
107a0 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
107b0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
107c0 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ();.    sqlite3O
107d0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
107e0 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  , 0);.    enable
107f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10800 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52  rors();.    IOTR
10810 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
10820 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
10830 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
10840 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
10850 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29  r->fd, pDest, N)
10860 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10870 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
10880 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
10890 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
108a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
108b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
108c0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
108d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
108e0 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
108f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10900 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
10910 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
10920 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
10930 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
10940 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
10950 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
10960 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
10970 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
10980 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
10990 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
109a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
109b0 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
109c0 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
109d0 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
109e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
109f0 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
10a00 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
10a10 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
10a20 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
10a30 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
10a40 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e  pPager){.  i64 n
10a50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
10a60 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
10a70 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10a80 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
10a90 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10aa0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
10ab0 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
10ac0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
10ad0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
10ae0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
10af0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
10b00 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51  er->fd, &n))!=SQ
10b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10b20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
10b30 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
10b40 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10b50 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e      if( n>0 && n
10b60 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  <pPager->pageSiz
10b70 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31  e ){.      n = 1
10b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10b90 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e     n /= pPager->
10ba0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10bb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10bc0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
10bd0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
10be0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
10bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10c00 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54   n==(PENDING_BYT
10c10 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
10c20 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  ze) ){.    n++;.
10c30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
10c40 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
10c50 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10c60 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50  ./*.** Clear a P
10c70 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a  gHistory block.*
10c80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
10c90 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73  earHistory(PgHis
10ca0 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20  tory *pHist){.  
10cb0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
10cc0 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69  ->pOrig);.  sqli
10cd0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
10ce0 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
10cf0 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
10d00 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
10d10 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
10d20 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
10d30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
10d40 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
10d50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
10d60 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
10d70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  );../*.** Unlink
10d80 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
10d90 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
10da0 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
10db0 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
10dc0 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
10dd0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
10de0 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
10df0 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
10e00 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
10e10 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
10e20 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  rMovepage() rout
10e30 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
10e40 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
10e50 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
10e60 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
10e70 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
10e80 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
10e90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
10ea0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
10eb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
10ec0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
10ed0 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
10ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
10ef0 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
10f00 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
10f10 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
10f20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10f30 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
10f40 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
10f50 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
10f60 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
10f70 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
10f80 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
10f90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
10fa0 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20  ash[pPg->pgno & 
10fb0 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
10fc0 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  )]!=pPg );.    p
10fd0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
10fe0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
10ff0 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
11000 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
11010 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
11020 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
11030 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
11040 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
11050 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
11060 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
11070 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
11080 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
11090 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
110a0 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
110b0 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
110c0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
110d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
110e0 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
110f0 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
11100 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
11110 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
11120 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
11130 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
11140 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
11150 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
11160 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
11170 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
11180 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
11190 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
111a0 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
111b0 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
111c0 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
111d0 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
111e0 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
111f0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
11200 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
11210 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
11220 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
11230 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
11240 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
11250 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
11260 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
11270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
11280 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
11290 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
112a0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
112b0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
112c0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
112d0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
112e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
112f0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
11300 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
11310 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
11320 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
11330 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
11340 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
11350 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
11360 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
11370 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
11380 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11390 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
113a0 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
113b0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
113c0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
113d0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
113e0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
113f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
11400 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
11410 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
11420 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
11430 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
11440 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11450 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
11460 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11470 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
11480 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncate an in-memo
11490 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65  ry database.  De
114a0 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65  lete.** all page
114b0 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20  s whose pgno is 
114c0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
114d0 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69  er->dbSize and i
114e0 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a  s unreferenced..
114f0 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
11500 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
11510 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
11520 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74  re zeroed..*/.st
11530 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79  atic void memory
11540 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
11550 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
11560 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
11570 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
11580 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
11590 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
115a0 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
115b0 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
115c0 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
115d0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
115e0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
115f0 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
11600 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
11610 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
11620 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
11630 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
11640 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
11650 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
11660 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
11670 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
11680 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
11690 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
116a0 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
116b0 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65  pPg);.      make
116c0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
116d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
116e0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
116f0 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
11700 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
11710 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  ine memoryTrunca
11720 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  te(p).#endif../*
11730 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
11740 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
11750 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
11760 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
11770 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
11780 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
11790 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
117a0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
117b0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
117c0 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
117d0 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
117e0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
117f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
11800 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
11810 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
11820 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
11830 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
11840 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
11850 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
11860 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
11870 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
11880 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53  rc;..  /* The OS
11890 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
118a0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
118b0 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
118c0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
118d0 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
118e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
118f0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
11900 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
11910 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
11920 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
11930 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
11940 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
11950 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
11960 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
11970 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
11980 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a  ust be unknown *
11990 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
119a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
119b0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
119c0 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d  r->dbSize<0 || M
119d0 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70  EMDB );..  if( p
119e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
119f0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
11a00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11a10 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
11a20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11a30 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
11a40 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
11a50 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
11a60 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
11a70 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11a80 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
11a90 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
11aa0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11ac0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11ad0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
11ae0 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
11af0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
11b00 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
11b10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
11b20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
11b30 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
11b40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
11b50 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
11b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
11b70 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65  gerTruncate(Page
11b80 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
11b90 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
11ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11bb0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11bc0 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42  _SHARED || MEMDB
11bd0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
11be0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
11bf0 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
11c00 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
11c10 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
11c20 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  rrCode;.    retu
11c30 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
11c40 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
11c50 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
11c60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11c70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11c80 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
11c90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
11ca0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  = nPage;.    mem
11cb0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
11cc0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
11cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11ce0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
11cf0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
11d00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11d10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
11d30 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11d40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
11d50 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
11d60 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
11d70 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11d80 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
11d90 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
11da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11db0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11dc0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
11dd0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
11de0 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  r, nPage);.  if(
11df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11e00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
11e10 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11e20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11e30 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
11e40 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
11e50 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
11e60 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
11e70 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
11e80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
11e90 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
11ea0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
11eb0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
11ec0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
11ed0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
11ee0 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
11ef0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
11f00 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
11f10 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
11f20 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
11f30 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
11f40 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
11f50 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
11f60 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
11f70 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
11f80 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
11f90 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
11fa0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
11fb0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
11fc0 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
11fd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
11fe0 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
11ff0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
12000 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
12010 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
12020 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
12030 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
12040 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
12050 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
12060 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
12070 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
12080 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
12090 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
120a0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
120b0 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  er){.#ifdef SQLI
120c0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
120d0 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
120e0 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
120f0 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
12100 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
12110 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
12120 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
12130 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
12140 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
12150 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
12160 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
12170 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
12180 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
12190 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
121a0 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
121b0 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
121c0 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
121d0 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
121e0 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  n be set..  */. 
121f0 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
12200 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
12210 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
12220 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61  t( pPager );.  a
12230 73 73 65 72 74 28 20 70 54 73 64 20 26 26 20 70  ssert( pTsd && p
12240 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23  Tsd->nAlloc );.#
12250 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65  endif..  disable
12260 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12270 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72  rors();.  pPager
12280 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
12290 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
122a0 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
122b0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
122c0 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  );.  pagerUnlock
122d0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
122e0 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  er);.  enable_si
122f0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
12300 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
12310 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
12320 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
12330 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
12340 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
12350 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20 70  er)).  assert( p
12360 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
12370 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
12380 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
12390 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
123a0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
123b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
123c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
123d0 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
123e0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
123f0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
12400 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
12410 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
12420 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12430 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
12440 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  stfd);.  }.  sql
12450 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
12460 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54  ger->fd);.  /* T
12470 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
12480 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
12490 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
124a0 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
124b0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
124c0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
124d0 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
124e0 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
124f0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
12500 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
12510 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  ANAGEMENT.  /* R
12520 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20  emove the pager 
12530 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20  from the linked 
12540 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 73  list of pagers s
12550 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a  tarting at .  **
12560 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61 67   ThreadData.pPag
12570 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  er if memory-man
12580 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
12590 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
125a0 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61  Pager==pTsd->pPa
125b0 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d  ger ){.    pTsd-
125c0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
125d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
125e0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d  {.    Pager *pTm
125f0 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20  p;.    for(pTmp 
12600 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20  = pTsd->pPager; 
12610 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61  pTmp->pNext!=pPa
12620 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  ger; pTmp=pTmp->
12630 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d  pNext){}.    pTm
12640 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  p->pNext = pPage
12650 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65  r->pNext;.  }.#e
12660 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65  ndif.  sqliteFre
12670 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
12680 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
12690 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
126a0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
126b0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
126c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
126d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
126e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
126f0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
12700 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
12710 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
12720 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
12730 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
12740 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
12750 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
12760 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
12770 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
12780 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
12790 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
127a0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
127b0 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
127c0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
127d0 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
127e0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
127f0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
12800 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
12810 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
12820 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
12830 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
12840 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
12850 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
12860 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
12870 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
12880 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
12890 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
128a0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
128b0 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
128c0 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
128d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
128e0 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
128f0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
12900 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
12910 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
12920 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
12930 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
12940 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
12950 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
12960 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12970 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
12980 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
12990 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
129a0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
129b0 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
129c0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
129d0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
129e0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
129f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12a00 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
12a10 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
12a20 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
12a30 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12a40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12a50 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12a60 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
12a70 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
12a80 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
12a90 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
12aa0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
12ab0 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
12ac0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
12ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12ae0 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
12af0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
12b00 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
12b10 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
12b20 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
12b30 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
12b40 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
12b50 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
12b60 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
12b70 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
12b80 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
12b90 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
12ba0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
12bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12bc0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
12bd0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
12be0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
12bf0 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
12c00 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
12c10 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
12c20 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
12c30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12c40 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
12c50 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
12c60 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
12c70 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
12c80 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
12c90 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
12ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12cb0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
12cc0 70 50 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66  pPg){.  page_ref
12cd0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
12ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12cf0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
12d00 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
12d10 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
12d20 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
12d30 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
12d40 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
12d50 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
12d60 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
12d70 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
12d80 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
12d90 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
12da0 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
12db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
12dc0 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
12dd0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
12de0 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
12df0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
12e00 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
12e10 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
12e20 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
12e30 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
12e40 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
12e50 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
12e60 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
12e70 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
12e80 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
12e90 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
12ea0 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
12eb0 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
12ec0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
12ed0 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
12ee0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12ef0 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
12f00 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
12f10 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
12f20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
12f30 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
12f40 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
12f50 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
12f60 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12f70 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
12f80 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
12f90 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
12fa0 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
12fb0 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
12fc0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
12fd0 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
12fe0 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
12ff0 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
13000 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
13010 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
13020 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
13030 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
13040 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
13050 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
13060 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
13070 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
13080 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
13090 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
130a0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
130b0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
130c0 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
130d0 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
130e0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
130f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
13100 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
13110 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
13120 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
13130 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
13140 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
13150 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
13160 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
13170 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
13180 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
13190 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
131a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
131b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
131c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
131d0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
131e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
131f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
13200 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
13210 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
13220 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
13230 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
13240 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
13250 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
13260 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
13270 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
13280 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
13290 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
132a0 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
132b0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
132c0 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
132d0 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
132e0 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
132f0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
13300 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
13310 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
13320 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
13330 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
13340 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
13350 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
13360 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
13370 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
13380 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
13390 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
133a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
133b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
133c0 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
133d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
133e0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
133f0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
13400 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
13410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
13420 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
13430 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
13440 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
13450 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
13460 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
13470 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
13480 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
13490 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
134a0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
134b0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
134c0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
134d0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
134e0 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
134f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13500 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
13510 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
13520 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
13530 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
13540 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13550 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
13560 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
13570 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
13580 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
13590 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
135a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
135b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
135c0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
135d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
135e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
135f0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
13600 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13620 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
13630 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
13640 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
13650 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13660 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
13670 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
13680 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
13690 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ager,.          
136a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
136b0 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
136c0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
136d0 63 29 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20  c), 4)).        
136e0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
136f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
13700 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
13710 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
13720 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
13730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13740 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
13750 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
13760 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  lOff);.        i
13770 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13780 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
13790 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
137a0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
137b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
137c0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
137d0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c  RACE(("JSYNC %d\
137e0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
137f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13800 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
13810 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
13820 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  fsync);.      if
13830 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
13840 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
13850 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
13860 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
13870 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
13880 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
13890 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
138a0 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
138b0 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
138c0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
138d0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
138e0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
138f0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
13900 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
13910 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
13920 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
13930 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
13940 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13950 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
13960 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
13970 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
13980 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
13990 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
139a0 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
139b0 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
139c0 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
139d0 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
139e0 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
139f0 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
13a00 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
13a10 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
13a20 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
13a30 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
13a40 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
13a50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13a60 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
13a70 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
13a80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
13a90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13aa0 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c  *.** Merge two l
13ab0 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f  ists of pages co
13ac0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
13ad0 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72  y and in pgno or
13ae0 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62  der..** Do not b
13af0 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70  oth fixing the p
13b00 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
13b10 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  rs..*/.static Pg
13b20 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c  Hdr *merge_pagel
13b30 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50  ist(PgHdr *pA, P
13b40 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48  gHdr *pB){.  PgH
13b50 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69  dr result, *pTai
13b60 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65  l;.  pTail = &re
13b70 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  sult;.  while( p
13b80 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69  A && pB ){.    i
13b90 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e  f( pA->pgno<pB->
13ba0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54  pgno ){.      pT
13bb0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
13bc0 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
13bd0 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  pA;.      pA = p
13be0 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  A->pDirty;.    }
13bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69  else{.      pTai
13c00 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
13c10 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42        pTail = pB
13c20 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
13c30 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
13c40 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
13c50 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13c60 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69   = pA;.  }else i
13c70 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61  f( pB ){.    pTa
13c80 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
13c90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
13ca0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ail->pDirty = 0;
13cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
13cc0 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a  sult.pDirty;.}..
13cd0 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c  /*.** Sort the l
13ce0 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
13cf0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
13d00 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20  by pgno.  Pages 
13d10 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  are.** connected
13d20 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74   by pDirty point
13d30 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44  ers.  The pPrevD
13d40 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72  irty pointers ar
13d50 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62  e.** corrupted b
13d60 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a  y this sort..*/.
13d70 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
13d80 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23  UCKET_ALLOC 25.#
13d90 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
13da0 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69  CKET       25.#i
13db0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13dc0 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  .  int sqlite3_p
13dd0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
13de0 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66  et = 0;.  #undef
13df0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20   N_SORT_BUCKET. 
13e00 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f   #define N_SORT_
13e10 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c  BUCKET \.   (sql
13e20 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
13e30 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33  t_bucket?sqlite3
13e40 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
13e50 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b  cket:N_SORT_BUCK
13e60 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66  ET_ALLOC).#endif
13e70 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73  .static PgHdr *s
13e80 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ort_pagelist(PgH
13e90 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64  dr *pIn){.  PgHd
13ea0 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b  r *a[N_SORT_BUCK
13eb0 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20  ET_ALLOC], *p;. 
13ec0 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74   int i;.  memset
13ed0 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29  (a, 0, sizeof(a)
13ee0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20  );.  while( pIn 
13ef0 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a  ){.    p = pIn;.
13f00 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69      pIn = p->pDi
13f10 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
13f20 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ty = 0;.    for(
13f30 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=0; i<N_SORT_BU
13f40 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  CKET-1; i++){.  
13f50 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20      if( a[i]==0 
13f60 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  ){.        a[i] 
13f70 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = p;.        bre
13f80 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
13f90 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72  .        p = mer
13fa0 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
13fb0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b  , p);.        a[
13fc0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
13fd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
13fe0 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  =N_SORT_BUCKET-1
13ff0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76   ){.      /* Cov
14000 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65  erage: To get he
14010 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74  re, there need t
14020 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42  o be 2^(N_SORT_B
14030 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a  UCKET) .      **
14040 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
14050 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69   input list. Thi
14060 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62  s is possible, b
14070 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a  ut impractical..
14080 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67        ** Testing
14090 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68   this line is th
140a0 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61  e point of globa
140b0 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  l variable.     
140c0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65   ** sqlite3_page
140d0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e  r_n_sort_bucket.
140e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
140f0 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67  a[i] = merge_pag
14100 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
14110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20      }.  }.  p = 
14120 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  a[0];.  for(i=1;
14130 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54   i<N_SORT_BUCKET
14140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
14150 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70  merge_pagelist(p
14160 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  , a[i]);.  }.  r
14170 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
14180 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
14190 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
141a0 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
141b0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
141c0 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
141d0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
141e0 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
141f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
14200 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
14210 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
14220 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
14230 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
14240 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
14250 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
14260 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
14270 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
14280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
14290 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
142a0 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
142b0 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
142c0 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
142d0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
142e0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
142f0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
14300 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
14310 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
14320 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
14330 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
14340 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
14350 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
14360 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
14370 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
14380 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
14390 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
143a0 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
143b0 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
143c0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
143d0 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
143e0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
143f0 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
14400 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
14410 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
14420 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
14430 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
14440 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
14450 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
14460 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
14470 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
14480 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
14490 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
144a0 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
144b0 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
144c0 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
144d0 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
144e0 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
144f0 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
14500 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
14510 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
14520 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
14530 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
14540 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
14550 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
14560 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
14570 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
14580 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
14590 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
145a0 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
145b0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
145c0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
145d0 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
145e0 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
145f0 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
14600 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
14610 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
14620 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
14630 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
14640 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
14650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
14670 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d  ;.  }..  pList =
14680 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70   sort_pagelist(p
14690 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  List);.  while( 
146a0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
146b0 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
146c0 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  y );.    rc = sq
146d0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
146e0 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
146f0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
14700 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14710 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
14720 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49  urn rc;.    /* I
14730 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
14740 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
14750 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
14760 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
14770 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
14780 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
14790 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
147a0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20  PagerTruncate() 
147b0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
147c0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
147d0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
147e0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
147f0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
14800 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
14810 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
14820 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
14830 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
14840 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
14850 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
14860 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
14870 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47  ODEC2(pPager, PG
14880 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
14890 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
148a0 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52   6);.      PAGER
148b0 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64  TRACE3("STORE %d
148c0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
148d0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
148e0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
148f0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
14900 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
14910 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
14920 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ).      rc = sql
14930 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
14940 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
14950 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14960 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43  ;.      TEST_INC
14970 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
14980 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
14990 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
149a0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
149b0 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
149c0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
149d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
149e0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
149f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
14a00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14a10 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
14a20 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
14a30 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14a40 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
14a50 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
14a60 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
14a70 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
14a80 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
14a90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14aa0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14ab0 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
14ac0 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
14ad0 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
14ae0 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
14af0 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
14b00 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
14b10 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
14b20 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
14b30 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
14b40 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
14b50 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
14b60 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
14b70 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
14b80 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
14b90 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  er->pDirty;.}../
14ba0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
14bb0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
14bc0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ot journal on th
14bd0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
14be0 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * A hot journal 
14bf0 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64  is one that need
14c00 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
14c10 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
14c20 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
14c30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14c40 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
14c50 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
14c60 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
14c70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
14c80 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
14c90 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
14ca0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
14cb0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a  he same name.  J
14cc0 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a  ust delete the j
14cd0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
14ce0 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
14cf0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
14d00 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r){.  if( !pPage
14d10 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
14d20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14d30 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78  !sqlite3OsFileEx
14d40 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  ists(pPager->zJo
14d50 75 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20  urnal) ) return 
14d60 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
14d70 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
14d80 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ock(pPager->fd) 
14d90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14da0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
14db0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
14dc0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14dd0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14de0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
14df0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
14e00 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
14e10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
14e20 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
14e30 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
14e40 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
14e50 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
14e60 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
14e70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14e80 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
14e90 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
14ea0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
14eb0 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
14ec0 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
14ed0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
14ee0 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
14ef0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
14f00 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
14f10 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
14f20 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
14f30 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
14f40 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
14f50 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
14f60 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
14f70 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
14f80 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
14f90 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
14fa0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
14fb0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
14fc0 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
14fd0 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
14fe0 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
14ff0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
15000 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
15010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15020 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
15030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
15040 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
15050 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
15060 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
15070 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
15080 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
15090 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
150a0 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
150b0 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
150c0 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
150d0 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
150e0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
150f0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
15100 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
15110 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
15120 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
15130 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
15140 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
15150 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
15160 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
15170 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
15180 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
15190 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
151a0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
151b0 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
151c0 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
151d0 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
151e0 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
151f0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
15200 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
15210 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
15220 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
15230 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
15240 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
15250 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
15260 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
15270 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
15280 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
15290 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
152a0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
152b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
152c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
152d0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
152e0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
152f0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
15300 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
15310 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
15320 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
15330 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
15340 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
15350 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61   }.    pPg = pPa
15360 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
15370 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
15380 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15390 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
153a0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
153b0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
153c0 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
153d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
153e0 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
153f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
15400 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74  dirty ){.    int
15410 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
15420 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
15430 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
15440 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 6d   !MEMDB );.    m
15450 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
15460 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
15470 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
15480 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
15490 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
154a0 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
154b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
154c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
154d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
154e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  }.  assert( pPg-
154f0 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
15500 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
15510 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
15520 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
15530 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
15540 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67  n.  ** set the g
15550 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
15560 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
15570 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
15580 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
15590 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  ontRollback() op
155a0 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
155b0 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
155c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
155d0 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
155e0 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
155f0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
15600 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
15610 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
15620 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
15630 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
15640 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
15650 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
15660 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
15670 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
15680 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
15690 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
156a0 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
156b0 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
156c0 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
156d0 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
156e0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
156f0 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
15700 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53  IOTRACE(("ALWAYS
15710 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c  _ROLLBACK %p\n",
15720 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50   pPager)).    pP
15730 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
15740 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  back = 1;.  }.. 
15750 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
15760 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
15770 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
15780 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
15790 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28  */.  unlinkPage(
157a0 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pPg);.  assert( 
157b0 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a  pPg->pgno==0 );.
157c0 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
157d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
157e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
157f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15800 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70  lled to free sup
15810 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63  erfluous dynamic
15820 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d  ally allocated m
15830 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79  emory.** held by
15840 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65   the pager syste
15850 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65  m. Memory in use
15860 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70   by any SQLite p
15870 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  ager allocated.*
15880 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  * by the current
15890 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73   thread may be s
158a0 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a 2a  qliteFree()ed..*
158b0 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65  *.** nReq is the
158c0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
158d0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69   of memory requi
158e0 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d  red. Once this m
158f0 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  uch has.** been 
15900 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75  released, the fu
15910 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
15920 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  A negative value
15930 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a   for nReq means.
15940 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68 20  ** free as much 
15950 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
15960 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  le. The return v
15970 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61  alue is the tota
15980 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20  l number .** of 
15990 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
159a0 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66  released..*/.#if
159b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
159c0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
159d0 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  ENT.int sqlite3P
159e0 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72  agerReleaseMemor
159f0 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63  y(int nReq){.  c
15a00 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20  onst ThreadData 
15a10 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65  *pTsdro = sqlite
15a20 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
15a30 6e 6c 79 28 29 3b 0a 20 20 50 61 67 65 72 20 2a  nly();.  Pager *
15a40 70 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73  p;.  int nReleas
15a50 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ed = 0;.  int i;
15a60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68  ..  /* If the th
15a70 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  e global mutex i
15a80 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62  s held, this sub
15a90 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20  routine becomes 
15aa0 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72  a.  ** o-op; zer
15ab0 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  o bytes of memor
15ac0 79 20 61 72 65 20 66 72 65 65 64 2e 20 20 54 68  y are freed.  Th
15ad0 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20 20  is is because.  
15ae0 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  ** some of the c
15af0 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ode invoked by t
15b00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
15b10 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74   also.  ** try t
15b20 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74  o obtain the mut
15b30 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ex, resulting in
15b40 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a   a deadlock..  *
15b50 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  /.  if( sqlite3O
15b60 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a 20  sInMutex(0) ){. 
15b70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
15b80 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74  ..  /* Outermost
15b90 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61   loop runs for a
15ba0 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61  t most two itera
15bb0 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65  tions. First ite
15bc0 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74  ration we.  ** t
15bd0 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72  ry to find memor
15be0 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  y that can be re
15bf0 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 63  leased without c
15c00 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20  alling fsync(). 
15c10 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72  Second.  ** iter
15c20 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c  ation (which onl
15c30 79 20 72 75 6e 73 20 69 66 20 74 68 65 20 66 69  y runs if the fi
15c40 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72  rst failed to fr
15c50 65 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66  ee nReq bytes of
15c60 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73  .  ** memory) is
15c70 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61   permitted to ca
15c80 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73  ll fsync(). This
15c90 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75   is of course mu
15ca0 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78  ch more .  ** ex
15cb0 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  pensive..  */.  
15cc0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69  for(i=0; i<=1; i
15cd0 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  ++){..    /* Loo
15ce0 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  p through all th
15cf0 65 20 53 51 4c 69 74 65 20 70 61 67 65 72 73 20  e SQLite pagers 
15d00 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63 75  opened by the cu
15d10 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f  rrent thread. */
15d20 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 73 64 72  .    for(p=pTsdr
15d30 6f 2d 3e 70 50 61 67 65 72 3b 20 70 20 26 26 20  o->pPager; p && 
15d40 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
15d50 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d  ased<nReq); p=p-
15d60 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50  >pNext){.      P
15d70 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
15d80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
15d90 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61 67 65  /* For each page
15da0 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65 20 61  r, try to free a
15db0 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20  s many pages as 
15dc0 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75  possible (withou
15dd0 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  t .      ** call
15de0 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66 20 74  ing fsync() if t
15df0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15e00 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
15e10 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20  e outermost .   
15e20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20     ** loop)..   
15e30 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c     */.      whil
15e40 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  e( SQLITE_OK==(r
15e50 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
15e60 65 28 70 2c 20 69 2c 20 26 70 50 67 29 29 20 26  e(p, i, &pPg)) &
15e70 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20  & pPg) {.       
15e80 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
15e90 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
15ea0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
15eb0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
15ec0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
15ed0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
15ee0 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
15ef0 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
15f00 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20  ed-list .       
15f10 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65   ** (pFirstSynce
15f20 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20  d). It is still 
15f30 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73  in the all pages
15f40 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20   (pAll) list. . 
15f50 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65         ** Remove
15f60 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
15f70 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
15f80 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g..        **.  
15f90 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43        ** Todo: C
15fa0 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70  heck the Pager.p
15fb0 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b  Stmt list to mak
15fc0 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f  e sure this is O
15fd0 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a  k. It .        *
15fe0 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68  * probably is th
15ff0 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ough..        */
16000 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
16010 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  pTmp;.        as
16020 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
16030 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
16040 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
16050 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
16060 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29  ( pPg==p->pAll )
16070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  {.           p->
16080 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
16090 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  tAll;.        }e
160a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
160b0 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c  or( pTmp=p->pAll
160c0 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  ; pTmp->pNextAll
160d0 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70  !=pPg; pTmp=pTmp
160e0 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20  ->pNextAll ){}. 
160f0 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70           pTmp->p
16100 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  NextAll = pPg->p
16110 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
16120 20 7d 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65   }.        nRele
16130 61 73 65 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c  ased += sqliteAl
16140 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a 20 20  locSize(pPg);.  
16150 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
16160 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  (pPg);.      }..
16170 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16190 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
161a0 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
161b0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
161c0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
161d0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
161e0 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63  l in pager_recyc
161f0 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20  le(). The error 
16200 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
16210 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
16220 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69  ** caller of thi
16230 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74  s function. Inst
16240 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67  ead, set the Pag
16250 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
16260 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble..        ** 
16270 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
16280 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
16290 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
162a0 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
162b0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73         ** of a s
162c0 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
162d0 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e) of the pager 
162e0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72  for which the er
162f0 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ror occured..   
16300 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16310 61 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66  assert( (rc&0xff
16320 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
16330 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  || rc==SQLITE_FU
16340 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  LL );.        as
16350 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
16360 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
16370 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  ;.        pager_
16380 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20  error(p, rc);.  
16390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
163a0 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
163b0 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
163c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
163d0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
163e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
163f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
16400 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
16410 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
16420 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
16430 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
16440 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
16450 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
16460 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
16470 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
16480 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
16490 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
164a0 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
164b0 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
164c0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
164d0 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64  ock (if required
164e0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
164f0 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61  .** checks for a
16500 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
16510 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  e. If one is fou
16520 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  nd, an emergency
16530 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20   rollback.** is 
16540 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69  performed immedi
16550 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
16560 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
16570 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
16580 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
16590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
165a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
165b0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
165c0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
165d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
165e0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
165f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
16600 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
16610 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  k ){.        rc 
16620 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
16630 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
16640 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
16650 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16670 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
16680 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
16690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
166a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
166b0 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
166c0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
166d0 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  }.  .      /* If
166e0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
166f0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
16700 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
16710 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
16720 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
16730 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
16740 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
16750 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
16760 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  eleted..      */
16770 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48 6f  .      if( hasHo
16780 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
16790 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   ){.        /* G
167a0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
167b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
167c0 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
167d0 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
167e0 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
167f0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
16800 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
16810 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
16820 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
16830 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
16840 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
16850 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
16860 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
16870 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
16880 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
16890 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
168a0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
168b0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
168c0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
168d0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
168e0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
168f0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
16900 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ng it .        *
16910 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  * back..        
16920 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42  ** .        ** B
16930 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
16940 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
16950 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
16960 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20  uested, the.    
16970 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
16980 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
16990 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
169a0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
169b0 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  l to.        ** 
169c0 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20  obtain it's own 
169d0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
169e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
169f0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
16a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16a10 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
16a20 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
16a30 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
16a40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16a50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
16a60 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
16a70 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
16a80 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
16a90 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
16aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16ab0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
16ac0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
16ad0 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;. .        /* O
16ae0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
16af0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
16b00 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
16b10 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
16b20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
16b30 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
16b40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
16b50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
16b60 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
16b70 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
16b80 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
16b90 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
16ba0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
16bb0 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
16bc0 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
16bd0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
16be0 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  holds.        **
16bf0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
16c00 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
16c10 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
16c20 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
16c30 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
16c40 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
16c50 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
16c60 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  time..        **
16c70 0a 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  ..** Open the jo
16c80 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
16c90 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
16ca0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
16cb0 0a 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61  ..** exclusive-a
16cc0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
16cd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
16ce0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
16cf0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
16d00 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
16d10 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
16d20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
16d30 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
16d40 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
16d50 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
16d60 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
16d70 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
16d80 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
16d90 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
16da0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
16db0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16dc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
16de0 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
16df0 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
16e00 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
16e10 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20   int ro;.       
16e20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
16e30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
16e40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16e50 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
16e60 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  Write(pPager->zJ
16e70 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
16e80 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20  >jfd, &ro);.    
16e90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
16ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
16eb0 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20  Pager->jfd );.  
16ec0 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 20 29          if( ro )
16ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
16ee0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16f00 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
16f10 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
16f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
16f30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16f40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16f50 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
16f60 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
16f70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16f80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
16fa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
16fb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
16fc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
16fd0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
16fe0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
16ff0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
17000 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
17010 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
17020 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17030 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20  Hdr = 0;. .     
17040 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
17050 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
17060 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
17070 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
17080 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20          ** lock 
17090 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
170a0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
170b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
170c0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
170d0 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
170e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
170f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17100 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
17110 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
17120 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  , rc);.        }
17130 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17140 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
17150 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a  AGER_SHARED || .
17160 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
17170 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
17180 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
17190 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
171a0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
171b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
171c0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
171d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
171e0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
171f0 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
17200 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
17210 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  e file.        *
17220 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
17230 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
17240 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
17250 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
17260 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
17270 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
17280 29 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  ). If the value 
17290 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  of the change-co
172a0 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  unter.        **
172b0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
172c0 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 6d 61  .iChangeCount ma
172d0 74 63 68 65 73 20 74 68 61 74 20 66 6f 75 6e 64  tches that found
172e0 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 0a 20 20   on page 1 of.  
172f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
17300 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
17310 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61   no database cha
17320 6e 67 65 73 20 68 61 76 65 20 6f 63 63 75 72 65  nges have occure
17330 64 20 73 69 6e 63 65 0a 20 20 20 20 20 20 20 20  d since.        
17340 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 61 73  ** the cache was
17350 20 6c 61 73 74 20 76 61 6c 69 64 20 61 6e 64 20   last valid and 
17360 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
17370 74 61 69 6e 20 74 68 65 20 63 61 63 68 65 64 0a  tain the cached.
17380 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73          ** pages
17390 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
173a0 50 61 67 65 72 2e 69 43 68 61 6e 67 65 43 6f 75  Pager.iChangeCou
173b0 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  nt does not matc
173c0 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  h the.        **
173d0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
173e0 6f 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  on page 1 of the
173f0 20 66 69 6c 65 2c 20 74 68 65 20 63 75 72 72 65   file, the curre
17400 6e 74 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  nt cache content
17410 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 75 73  s.        ** mus
17420 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  t be discarded..
17430 20 20 20 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20          */..    
17440 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
17450 31 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  1 = pager_lookup
17460 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
17470 20 20 20 20 20 69 66 28 20 70 50 61 67 65 31 20       if( pPage1 
17480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 6c  ){.          unl
17490 69 6e 6b 50 61 67 65 28 70 50 61 67 65 31 29 3b  inkPage(pPage1);
174a0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ..          /* M
174b0 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 6f 72  ake sure the for
174c0 6d 65 72 20 70 61 67 65 20 31 20 69 73 20 72 69  mer page 1 is ri
174d0 67 68 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ght at the start
174e0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
174f0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 2e 20    ** free-list. 
17500 54 68 69 73 20 74 72 69 67 67 65 72 73 20 61 20  This triggers a 
17510 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
17520 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
17530 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e().          **
17540 20 74 6f 20 72 65 2d 75 73 65 20 74 68 69 73 20   to re-use this 
17550 70 61 67 65 20 65 76 65 6e 20 69 66 20 74 68 65  page even if the
17560 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
17570 20 70 61 67 65 73 20 69 6e 0a 20 20 20 20 20 20   pages in.      
17580 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
17590 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 50 61   is less than Pa
175a0 67 65 72 2e 6d 78 50 61 67 65 2e 0a 20 20 20 20  ger.mxPage..    
175b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
175c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
175d0 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 61 67 65  r->pFirst==pPage
175e0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
175f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
17600 67 65 31 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ge1->pNextFree =
17610 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
17620 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
17630 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 7b  Pager->pFirst ){
17640 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
17650 67 65 72 2d 3e 70 46 69 72 73 74 2d 3e 70 50 72  ger->pFirst->pPr
17660 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 31 3b  evFree = pPage1;
17670 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
17680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
17690 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
176a0 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
176b0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
176c0 74 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 20 20  t = pPage1;.    
176d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
176e0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
176f0 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 20 20 20   = pPage1;.     
17700 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
17710 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
17720 65 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  e1;.        }.. 
17730 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
17740 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
17750 67 65 72 2c 20 31 29 20 29 3b 0a 20 20 20 20 20  ger, 1) );.     
17760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17770 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
17780 65 72 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  er, 1, &pPage1, 
17790 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
177a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
177b0 0a 09 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
177c0 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 73 74 6f  e-counter is sto
177d0 72 65 64 20 61 74 20 6f 66 66 73 65 74 20 32 34  red at offset 24
177e0 2e 20 53 65 65 20 61 6c 73 6f 0a 20 20 20 20 20  . See also.     
177f0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e       ** pager_in
17800 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
17810 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ()..          */
17820 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
17830 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65  ChangeCount = re
17840 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 61  trieve32bits(pPa
17850 67 65 31 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  ge1, 24);.      
17860 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
17870 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ++;.          sq
17880 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
17890 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
178a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
178b0 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  -;.          if(
178c0 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d 70   iChangeCount!=p
178d0 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
178e0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unt ){.         
178f0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17900 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17910 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50    }.          pP
17920 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75  ager->iChangeCou
17930 6e 74 20 3d 20 69 43 68 61 6e 67 65 43 6f 75 6e  nt = iChangeCoun
17940 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
17950 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
17960 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17970 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
17980 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50  pPager->state<=P
17990 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
179a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
179b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
179c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
179d0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
179e0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
179f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
17a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
17a10 61 74 65 20 6f 72 20 72 65 63 79 63 6c 65 20 73  ate or recycle s
17a20 70 61 63 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  pace for a singl
17a30 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
17a40 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63  c int pagerAlloc
17a50 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70  atePage(Pager *p
17a60 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
17a70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
17a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
17a90 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
17aa0 20 21 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73   !(pPager->pFirs
17ab0 74 53 79 6e 63 65 64 20 26 26 20 70 50 61 67 65  tSynced && pPage
17ac0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 2d  r->pFirstSynced-
17ad0 3e 70 67 6e 6f 3d 3d 30 29 20 26 26 20 28 0a 20  >pgno==0) && (. 
17ae0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
17af0 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
17b00 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69  e || pPager->pFi
17b10 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20  rst==0 || MEMDB 
17b20 7c 7c 0a 20 20 20 20 20 20 28 70 50 61 67 65 72  ||.      (pPager
17b30 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
17b40 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e  0 && pPager->doN
17b50 6f 74 53 79 6e 63 29 0a 20 20 29 20 29 7b 0a 20  otSync).  ) ){. 
17b60 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
17b70 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  ew page */.    i
17b80 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
17b90 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  >=pPager->nHash 
17ba0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
17bb0 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65  esize_hash_table
17bc0 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  (pPager,.       
17bd0 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c    pPager->nHash<
17be0 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67  256 ? 256 : pPag
17bf0 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20  er->nHash*2);.  
17c00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17c10 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  nHash==0 ){.    
17c20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17c30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67  NOMEM;.        g
17c40 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
17c50 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  te_out;.      }.
17c60 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
17c70 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
17c80 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
17c90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
17cc0 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
17cd0 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a          + MEMDB*
17d00 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
17d10 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  ) );.    if( pPg
17d20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
17d30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
17d40 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
17d50 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
17d60 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
17d70 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
17d80 70 50 67 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  pPg));.    if( M
17d90 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65  EMDB ){.      me
17da0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
17db0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
17dc0 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
17dd0 74 6f 72 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20  tory));.    }.  
17de0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
17df0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
17e00 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67  >pNextAll = pPag
17e10 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50  er->pAll;.    pP
17e20 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
17e30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50  ;.    pPager->nP
17e40 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
17e50 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61  Pager->nPage>pPa
17e60 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b  ger->nMaxPage ){
17e70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17e80 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d  Pager->nMaxPage=
17e90 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d  =(pPager->nPage-
17ea0 31 29 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  1) );.      pPag
17eb0 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a  er->nMaxPage++;.
17ec0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
17ed0 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e     /* Recycle an
17ee0 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77   existing page w
17ef0 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63  ith a zero ref-c
17f00 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ount. */.    rc 
17f10 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
17f20 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29  pPager, 1, &pPg)
17f30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17f40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17f50 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f   goto pager_allo
17f60 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cate_out;.    }.
17f70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17f80 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
17f90 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
17fa0 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20  sert(pPg);.  }. 
17fb0 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70   *ppPg = pPg;..p
17fc0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
17fd0 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
17fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
17ff0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
18000 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
18010 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
18020 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
18030 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
18040 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
18050 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
18060 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
18070 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
18080 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f  eased..**.** A _
18090 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  get works for an
180a0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
180b0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
180c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
180d0 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
180e0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
180f0 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
18100 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
18110 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
18120 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
18130 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
18140 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
18150 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
18160 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
18170 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
18180 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
18190 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
181a0 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
181b0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
181c0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
181d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
181e0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
181f0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
18200 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
18210 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
18220 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
18230 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
18240 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
18250 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
18260 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
18270 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
18280 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
18290 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29  ne and _lookup()
182a0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
182b0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
182c0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
182d0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
182e0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
182f0 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
18300 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
18310 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
18320 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
18330 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  as _lookup().** 
18340 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
18350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
18360 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
18370 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
18380 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
18390 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
183a0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
183b0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
183c0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
183d0 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70  ** Since _lookup
183e0 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
183f0 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
18400 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
18410 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
18420 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
18430 2a 20 49 66 20 63 6c 72 46 6c 61 67 20 69 73 20  * If clrFlag is 
18440 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20  false, the page 
18450 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74  contents are act
18460 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
18470 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66 46  disk..** If clfF
18480 6c 61 67 20 69 73 20 74 72 75 65 2c 20 69 74 20  lag is true, it 
18490 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
184a0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 65 72  s about to be er
184b0 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77 72  ased and.** rewr
184c0 69 74 74 65 6e 20 77 69 74 68 6f 75 74 20 66 69  itten without fi
184d0 72 73 74 20 62 65 69 6e 67 20 72 65 61 64 20 73  rst being read s
184e0 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  o there is no po
184f0 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a 20  int it doing.** 
18500 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f  the disk I/O..*/
18510 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
18520 72 41 63 71 75 69 72 65 28 50 61 67 65 72 20 2a  rAcquire(Pager *
18530 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
18540 6f 2c 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  o, DbPage **ppPa
18550 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29  ge, int clrFlag)
18560 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
18570 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
18580 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
18590 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
185a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
185b0 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
185c0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
185d0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
185e0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
185f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
18600 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
18610 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18620 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
18630 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
18640 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
18650 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
18660 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
18670 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
18680 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
18690 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
186a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
186b0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
186c0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
186d0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
186e0 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
186f0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
18700 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
18710 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
18720 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
18730 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
18740 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
18750 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
18760 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
18770 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
18780 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
18790 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
187a0 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
187b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
187c0 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
187d0 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
187e0 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
187f0 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
18800 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
18810 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
18820 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
18830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18840 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
18850 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
18860 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18870 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
18880 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
18890 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
188a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
188b0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
188c0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
188d0 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
188e0 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
188f0 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
18900 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54   int h;.    TEST
18910 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
18920 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  iss);.    rc = p
18930 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
18940 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a  (pPager, &pPg);.
18950 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18980 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
18990 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70   pgno;.    if( p
189a0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
189b0 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
189c0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
189d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
189e0 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70  te3CheckMemory(p
189f0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
18a00 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20  l, pgno/8);.    
18a10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18a20 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
18a30 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
18a40 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
18a50 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
18a60 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
18a70 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70  7)))!=0;.      p
18a80 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
18a90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18aa0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
18ab0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
18ac0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
18ad0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
18ae0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26  ager->aInStmt &&
18af0 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
18b00 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20  er->stmtSize.   
18b10 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
18b20 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67  ager->aInStmt[pg
18b30 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
18b40 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  o&7)))!=0 ){.   
18b50 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
18b60 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
18b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18b80 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
18b90 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
18ba0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61 6b 65 43  .    }.    makeC
18bb0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
18bc0 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
18bd0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
18be0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
18bf0 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  f++;.    if( pPa
18c00 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
18c10 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
18c20 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
18c30 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
18c40 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
18c50 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20     }.    nMax = 
18c60 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
18c70 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
18c80 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
18c90 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
18ca0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
18cb0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63  f(pPg);.      rc
18cc0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
18cd0 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  de;.      return
18ce0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
18cf0 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
18d00 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20  page with data, 
18d10 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e  either by readin
18d20 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
18d30 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c  ase.    ** file,
18d40 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74   or by setting t
18d50 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74  he entire page t
18d60 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  o zero..    */. 
18d70 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
18d80 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
18d90 7c 20 28 63 6c 72 46 6c 61 67 20 26 26 20 21 70  | (clrFlag && !p
18da0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
18db0 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  lback) ){.      
18dc0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
18dd0 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
18de0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
18df0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18e00 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d    assert( MEMDB=
18e10 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
18e20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
18e30 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
18e40 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
18e50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
18e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18e80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
18e90 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  d(pPager->fd, PG
18ea0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
18eb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ed0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18ee0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18ef0 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
18f00 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
18f10 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 50  , pgno)).      P
18f20 41 47 45 52 54 52 41 43 45 33 28 22 46 45 54 43  AGERTRACE3("FETC
18f30 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
18f40 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
18f50 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
18f60 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
18f70 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
18f80 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
18f90 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 3);.      if( 
18fa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
18fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
18fc0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
18fd0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
18fe0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
18ff0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
19000 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
19010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
19030 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
19040 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 7d  >nRead);.      }
19050 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
19060 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74  ink the page int
19070 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20  o the page hash 
19080 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d  table */.    h =
19090 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
190a0 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61  >nHash-1);.    a
190b0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
190c0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
190d0 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
190e0 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
190f0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
19100 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
19110 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
19120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
19130 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
19140 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
19150 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
19160 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
19170 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
19180 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
19190 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
191a0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
191b0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
191c0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
191d0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
191e0 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
191f0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
19200 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
19210 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
19220 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 69 66 28 20  no==1);.    if( 
19230 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65  pgno>sqlite3Page
19240 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
19250 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  r) ){.      /* T
19260 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 61  his can happen a
19270 66 74 65 72 20 61 20 74 72 75 6e 63 61 74 69 6f  fter a truncatio
19280 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  n in exclusive m
19290 6f 64 65 2e 20 54 68 65 20 70 61 67 65 72 0a 20  ode. The pager. 
192a0 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 6f       ** cache co
192b0 6e 74 61 69 6e 73 20 70 61 67 65 73 20 74 68 61  ntains pages tha
192c0 74 20 61 72 65 20 6c 6f 63 61 74 65 64 20 61 66  t are located af
192d0 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
192e0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  he .      ** dat
192f0 61 62 61 73 65 20 66 69 6c 65 2e 20 5a 65 72 6f  abase file. Zero
19300 20 73 75 63 68 20 70 61 67 65 73 20 62 65 66 6f   such pages befo
19310 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4e 6f  re returning. No
19320 74 20 64 6f 69 6e 67 20 74 68 69 73 20 0a 20 20  t doing this .  
19330 20 20 20 20 2a 2a 20 77 61 73 20 63 61 75 73 69      ** was causi
19340 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 72  ng the problem r
19350 65 70 6f 72 74 65 64 20 69 6e 20 74 69 63 6b 65  eported in ticke
19360 74 20 23 32 32 38 35 2e 0a 20 20 20 20 20 20 2a  t #2285..      *
19370 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
19380 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
19390 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
193a0 61 73 65 20 63 61 74 63 68 65 73 20 61 6e 20 49  ase catches an I
193b0 4f 20 65 72 72 6f 72 20 69 6e 20 73 71 6c 69 74  O error in sqlit
193c0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
193d0 28 29 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  (). If.        *
193e0 2a 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  * the error occu
193f0 72 65 64 2c 20 50 61 67 65 72 50 61 67 65 63 6f  red, PagerPageco
19400 75 6e 74 28 29 20 72 65 74 75 72 6e 65 64 20 30  unt() returned 0
19410 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
19420 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
19430 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
19440 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
19450 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
19460 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
19470 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
19480 7d 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28  }.    TEST_INCR(
19490 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
194a0 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
194b0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
194c0 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
194d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
194e0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
194f0 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
19500 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
19510 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
19520 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
19530 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
19540 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
19550 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
19560 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
19570 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
19580 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
19590 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
195a0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
195b0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
195c0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
195d0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
195e0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
195f0 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
19600 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
19610 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
19620 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
19630 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
19640 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
19650 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
19660 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
19670 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
19680 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
19690 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
196a0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
196b0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
196c0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
196d0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
196e0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
196f0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
19700 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
19710 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
19720 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19730 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
19740 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
19750 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  ( !pPager->pAll 
19760 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  || pPager->exclu
19770 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20  siveMode );.    
19780 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19790 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
197a0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
197b0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
197c0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
197d0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  n 0;.  }.  pPg =
197e0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
197f0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
19800 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75  f( pPg==0 ) retu
19810 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66  rn 0;.  page_ref
19820 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
19830 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
19840 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
19850 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
19860 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
19870 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
19880 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
19890 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
198a0 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
198b0 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
198c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
198d0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
198e0 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
198f0 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
19900 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
19910 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
19920 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
19930 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
19940 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20  bPage *pPg){..  
19950 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
19960 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
19970 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
19980 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
19990 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
199a0 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
199b0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43  FINFO(pPg);..  C
199c0 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
199d0 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
199e0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
199f0 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
19a00 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
19a10 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
19a20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
19a30 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
19a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
19a50 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
19a60 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
19a70 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
19a80 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
19a90 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
19aa0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
19ab0 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
19ac0 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
19ad0 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
19ae0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
19af0 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
19b00 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
19b10 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
19b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19b30 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
19b40 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
19b50 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
19b60 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
19b70 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
19b80 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
19b90 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
19ba0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
19bb0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
19bc0 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
19bd0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
19be0 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
19bf0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
19c00 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
19c10 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
19c20 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
19c30 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
19c40 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
19c50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19c60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
19c70 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
19c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19c90 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
19ca0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
19cb0 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d  ==0 && (!pPager-
19cc0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
19cd0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
19ce0 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20  lOff>0) ){.     
19cf0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
19d00 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
19d10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19d20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19d30 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
19d40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
19d50 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
19d60 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
19d70 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
19d80 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
19d90 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19da0 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
19db0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
19dc0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
19dd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
19de0 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
19df0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
19e00 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
19e10 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
19e20 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
19e30 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
19e40 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
19e50 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
19e60 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
19e70 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
19e80 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
19e90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
19ea0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
19eb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19ec0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
19ed0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19ee0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
19ef0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
19f00 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19f10 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
19f20 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
19f30 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
19f40 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
19f50 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
19f60 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
19f70 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
19f80 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
19f90 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
19fa0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
19fb0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
19fc0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
19fd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19fe0 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70  sOpenExclusive(p
19ff0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1a000 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20   &pPager->jfd,. 
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
1a050 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1a060 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70  ager->jfd );.  p
1a070 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a080 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
1a090 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1a0a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a0b0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
1a0c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a0d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a0e0 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
1a0f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
1a100 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
1a110 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
1a120 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1a130 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
1a140 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46  .  sqlite3OsSetF
1a150 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  ullSync(pPager->
1a160 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
1a170 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69  l_fsync);.  sqli
1a180 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63  te3OsSetFullSync
1a190 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
1a1a0 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
1a1b0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  ;.  sqlite3OsOpe
1a1c0 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65  nDirectory(pPage
1a1d0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1a1e0 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70  zDirectory);.  p
1a1f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a200 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  en = 1;.  pPager
1a210 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1a220 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1a230 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1a240 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1a250 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50  llback = 0;.  pP
1a260 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
1a270 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1a280 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
1a290 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1a2a0 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  e;.    goto fail
1a2b0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1a2c0 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
1a2d0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1a2e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
1a2f0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1a300 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1a310 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1a320 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
1a330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a350 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  PagerStmtBegin(p
1a360 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
1a370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a380 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
1a390 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MEM ){.    rc = 
1a3a0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1a3b0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
1a3c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a3d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1a3e0 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1a3f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a400 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
1a410 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
1a420 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
1a430 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
1a440 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
1a450 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
1a460 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a470 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74  * Acquire a writ
1a480 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e-lock on the da
1a490 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63  tabase.  The loc
1a4a0 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65  k is removed whe
1a4b0 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20  n.** the any of 
1a4c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61  the following ha
1a4d0 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ppen:.**.**   * 
1a4e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1a4f0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73  mitPhaseTwo() is
1a500 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1a510 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1a520 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
1a530 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
1a540 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69  e3PagerClose() i
1a550 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1a560 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1a570 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ref() is called 
1a580 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73  to on every outs
1a590 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a  tanding page..**
1a5a0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
1a5b0 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
1a5c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
1a5d0 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
1a5e0 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
1a5f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1a600 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
1a610 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
1a620 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
1a630 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65  ly to.** acquire
1a640 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1a650 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1a660 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
1a670 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  hat there is.** 
1a680 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1a690 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a6a0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ase..**.** The s
1a6b0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1a6c0 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75  indicates how mu
1a6d0 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  ch space in byte
1a6e0 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  s to reserve for
1a6f0 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75   a.** master jou
1a700 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61  rnal file-name a
1a710 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1a720 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20  he journal when 
1a730 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a  it is created..*
1a740 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66  *.** A journal f
1a750 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ile is opened if
1a760 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
1a770 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
1a780 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  For temporary.**
1a790 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e   files, the open
1a7a0 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
1a7b0 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
1a7c0 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
1a7d0 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20  is an.** actual 
1a7e0 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  need to write to
1a7f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1a800 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
1a810 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72  ase is already r
1a820 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74  eserved for writ
1a830 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ing, this routin
1a840 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
1a850 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73  .** If exFlag is
1a860 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20   true, go ahead 
1a870 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55  and get an EXCLU
1a880 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1a890 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61   file.** immedia
1a8a0 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20  tely instead of 
1a8b0 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65  waiting until we
1a8c0 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68   try to flush th
1a8d0 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a  e cache.  The.**
1a8e0 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72   exFlag is ignor
1a8f0 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ed if a transact
1a900 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
1a910 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
1a920 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1a930 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  DbPage *pPg, int
1a940 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65   exFlag){.  Page
1a950 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1a960 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1a970 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a980 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1a990 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
1a9a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1a9b0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1a9c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1a9d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
1a9e0 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
1a9f0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1aa00 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
1aa10 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1aa20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1aa30 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
1aa40 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
1aa50 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1aa60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1aa70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1aa80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1aa90 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
1aaa0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
1aab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aad0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1aae0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
1aaf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46  .        if( exF
1ab00 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
1ab10 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1ab20 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1ab30 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1ab40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ab50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1ab60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ab70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ab80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab90 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1aba0 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41  he = 0;.      PA
1abb0 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53  GERTRACE2("TRANS
1abc0 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
1abd0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1abe0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1abf0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
1ac00 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1ac10 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
1ac20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1ac30 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1ac40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1ac50 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1ac60 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1ac70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ac80 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
1ac90 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1aca0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
1acb0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1acc0 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20  ss mode last.   
1acd0 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
1ace0 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
1acf0 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
1ad00 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
1ad10 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
1ad20 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
1ad30 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
1ad40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ad50 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
1ad60 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74   kept open and t
1ad70 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
1ad80 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tes..    */.    
1ad90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ada0 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
1adb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
1adc0 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a  rigDbSize==0 );.
1add0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ade0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1adf0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1ae00 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1ae10 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1ae20 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1ae30 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1ae40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1ae50 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  + 1 );.    if( !
1ae60 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ae70 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
1ae80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ae90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aea0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1aeb0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1aec0 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ize;.      rc = 
1aed0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1aee0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1aef0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50   }.  assert( !pP
1af00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1af10 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
1af20 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21  rnalOff>0 || rc!
1af30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1af40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1af50 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
1af60 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20  dirty.  Set its 
1af70 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61  dirty flag and a
1af80 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72  dd it to the dir
1af90 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e  ty.** page list.
1afa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1afb0 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20  makeDirty(PgHdr 
1afc0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1afd0 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20  ->dirty==0 ){.  
1afe0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1aff0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1b000 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1b010 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
1b020 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69  ty = pPager->pDi
1b030 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61  rty;.    if( pPa
1b040 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  ger->pDirty ){. 
1b050 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69       pPager->pDi
1b060 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
1b070 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
1b080 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1b090 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b0a0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  ->pDirty = pPg;.
1b0b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
1b0c0 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20  e a page clean. 
1b0d0 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79   Clear its dirty
1b0e0 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20   bit and remove 
1b0f0 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64  it from the.** d
1b100 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a  irty page list..
1b110 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1b120 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a  akeClean(PgHdr *
1b130 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1b140 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50  >dirty ){.    pP
1b150 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
1b160 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74    if( pPg->pDirt
1b170 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  y ){.      pPg->
1b180 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
1b190 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44  ty = pPg->pPrevD
1b1a0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
1b1b0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  if( pPg->pPrevDi
1b1c0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67  rty ){.      pPg
1b1d0 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
1b1e0 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
1b1f0 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
1b200 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
1b210 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
1b220 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
1b230 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  }.}.../*.** Mark
1b240 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
1b250 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
1b260 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
1b270 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1b280 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
1b290 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1b2a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1b2b0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
1b2c0 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
1b2d0 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
1b2e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1b2f0 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
1b300 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
1b310 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
1b320 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
1b330 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
1b340 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1b350 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1b360 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
1b370 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
1b380 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
1b390 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1b3a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
1b3b0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1b3c0 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
1b3d0 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
1b3e0 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
1b3f0 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
1b400 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
1b410 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
1b420 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1b430 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
1b440 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
1b450 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
1b460 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
1b470 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
1b480 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
1b490 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1b4a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
1b4b0 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
1b4c0 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
1b4d0 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
1b4e0 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
1b4f0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
1b500 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
1b510 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
1b520 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
1b530 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
1b540 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1b550 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
1b560 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b570 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
1b580 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
1b590 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54  *pData = PGHDR_T
1b5a0 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50  O_DATA(pPg);.  P
1b5b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1b5c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1b5d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b5e0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
1b5f0 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
1b600 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1b610 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
1b620 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1b630 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1b640 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
1b650 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b660 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
1b670 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1b680 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
1b690 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
1b6a0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
1b6b0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
1b6c0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
1b6d0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1b6e0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
1b6f0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
1b700 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
1b710 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
1b720 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
1b730 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
1b740 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
1b750 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
1b760 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
1b770 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
1b780 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1b790 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
1b7a0 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
1b7b0 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
1b7c0 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
1b7d0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
1b7e0 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
1b7f0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1b800 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
1b810 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
1b820 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
1b830 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
1b840 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
1b850 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b860 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
1b870 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
1b880 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
1b890 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
1b8a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b8b0 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1b8c0 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
1b8d0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1b8e0 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  (pPg, 0);.    if
1b8f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b900 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b910 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
1b920 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1b930 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1b940 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21  VED );.    if( !
1b950 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b960 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
1b970 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
1b980 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1b990 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1b9a0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1b9b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1b9c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1b9d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b9e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1b9f0 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
1ba00 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
1ba10 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1ba20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
1ba30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1ba40 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
1ba50 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
1ba60 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
1ba70 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1ba80 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
1ba90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1baa0 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
1bab0 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
1bac0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
1bad0 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
1bae0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
1baf0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
1bb00 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
1bb10 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
1bb20 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d  >useJournal || M
1bb30 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
1bb40 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
1bb50 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
1bb60 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
1bb70 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
1bb80 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1bb90 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69  {.          PgHi
1bba0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1bbb0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1bbc0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1bbd0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1bbe0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
1bbf0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1bc00 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1bc10 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1bc20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
1bc30 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Orig==0 );.     
1bc40 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
1bc50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
1bc60 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
1bc70 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
1bc80 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1bc90 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
1bca0 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
1bcb0 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
1bcc0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
1bcd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1bce0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1bcf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bd00 20 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73      u32 cksum, s
1bd10 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  aved;.          
1bd20 63 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70  char *pData2, *p
1bd30 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  End;.          /
1bd40 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
1bd50 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
1bd60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
1bd70 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
1bd80 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
1bd90 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
1bda0 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
1bdb0 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
1bdc0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1bdd0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
1bde0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1bdf0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
1be00 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1be10 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
1be20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
1be30 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1be40 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1be50 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
1be60 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
1be70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
1be80 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  a2);.          p
1be90 45 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70  End = pData2 + p
1bea0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1beb0 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
1bec0 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  2 -= 4;.        
1bed0 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
1bee0 29 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  )pEnd;.         
1bef0 20 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c   put32bits(pEnd,
1bf00 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
1bf10 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
1bf20 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
1bf30 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1bf40 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
1bf50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1bf60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1bf70 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1bf80 20 70 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a   pData2, szPg);.
1bf90 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
1bfa0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
1bfb0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
1bfc0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  r, pPg->pgno,.  
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfe0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bff0 4f 66 66 2c 20 73 7a 50 67 29 29 0a 20 20 20 20  Off, szPg)).    
1c000 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1c010 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67  urnalOff += szPg
1c020 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1c030 52 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c  RTRACE4("JOURNAL
1c040 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
1c050 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1c070 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c080 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1c090 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
1c0a0 20 20 20 20 2a 28 75 33 32 2a 29 70 45 6e 64 20      *(u32*)pEnd 
1c0b0 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20  = saved;...  /* 
1c0c0 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
1c0d0 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
1c0e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c0f0 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20  . The .         
1c100 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1c110 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
1c120 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
1c130 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
1c140 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
1c150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c170 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c180 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1c190 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
1c1a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1c1b0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1c1c0 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
1c1d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
1c1e0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1c1f0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1c200 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1c210 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1c220 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
1c230 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
1c240 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1c250 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
1c260 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1c270 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1c280 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1c290 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
1c2a0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1c2b0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1c2c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1c2e0 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  e{.        pPg->
1c2f0 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1c300 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1c310 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
1c320 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50  oSync;.        P
1c330 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45  AGERTRACE4("APPE
1c340 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
1c350 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1c370 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c380 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1c390 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
1c3a0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
1c3b0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1c3c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
1c3d0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1c3e0 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e   }.      pPg->in
1c3f0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1c400 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
1c410 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1c420 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
1c430 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
1c440 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
1c450 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
1c460 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
1c470 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1c480 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
1c490 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
1c4a0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
1c4b0 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
1c4c0 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
1c4d0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
1c4e0 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
1c4f0 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
1c500 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
1c510 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
1c520 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1c530 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
1c540 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
1c550 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1c560 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
1c570 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1c580 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
1c590 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
1c5a0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1c5b0 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1c5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1c5d0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1c5e0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1c5f0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1c600 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1c610 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
1c620 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1c630 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
1c640 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
1c650 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1c660 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1c670 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1c680 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
1c690 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
1c6a0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1c6b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1c6c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
1c6d0 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
1c6e0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1c6f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1c700 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1c710 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
1c720 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1c730 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1c740 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1c750 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20  g->pgno, 7)-4;. 
1c760 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1c770 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1c780 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
1c790 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1c7a0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1c7b0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1c7c0 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
1c7d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1c7e0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1c7f0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1c800 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1c810 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1c820 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1c860 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
1c870 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1c880 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1c890 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1c8a0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1c8b0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1c8c0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1c8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c8e0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1c8f0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
1c900 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1c910 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1c920 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1c930 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c940 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c950 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1c960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1c970 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
1c980 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1c990 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
1c9a0 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
1c9b0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1c9c0 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
1c9d0 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
1c9e0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
1c9f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
1ca00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ca10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ca20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ca30 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61  s used to mark a
1ca40 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72   data-page as wr
1ca50 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20  itable. It uses 
1ca60 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28  .** pager_write(
1ca70 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72  ) to open a jour
1ca80 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20  nal file (if it 
1ca90 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1caa0 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74  pen).** and writ
1cab0 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74  e the page *pDat
1cac0 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  a to the journal
1cad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
1cae0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1caf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
1cb00 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
1cb10 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
1cb20 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
1cb30 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
1cb40 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
1cb50 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
1cb60 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
1cb70 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
1cb80 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
1cb90 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
1cba0 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
1cbb0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1cbc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1cbd0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1cbe0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cbf0 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
1cc00 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
1cc10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cc20 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
1cc30 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
1cc40 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1cc50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
1cc60 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
1cc70 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
1cc80 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
1cc90 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
1cca0 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
1ccb0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
1ccc0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
1ccd0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
1cce0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1ccf0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1cd00 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
1cd10 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
1cd20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1cd30 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1cd40 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1cd50 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
1cd60 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
1cd70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cd80 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
1cd90 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
1cda0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
1cdb0 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74   ii;..    /* Set
1cdc0 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1cdd0 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1cde0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1cdf0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1ce00 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1ce10 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1ce20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1ce30 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1ce40 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1ce50 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1ce60 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1ce70 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
1ce80 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1ce90 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
1cea0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
1ceb0 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
1cec0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
1ced0 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
1cee0 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
1cef0 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
1cf00 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
1cf10 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
1cf20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1cf30 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1cf40 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1cf50 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
1cf60 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
1cf70 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
1cf80 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
1cf90 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
1cfa0 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
1cfb0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1cfc0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
1cfd0 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
1cfe0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1cff0 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
1d000 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
1d010 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
1d020 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
1d030 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1d040 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
1d050 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
1d060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
1d070 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
1d080 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
1d090 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
1d0a0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
1d0b0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
1d0c0 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
1d0d0 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
1d0e0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1d0f0 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
1d100 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
1d110 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
1d120 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69   pg1+ii;.      i
1d130 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
1d140 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50  ournal || pg==pP
1d150 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20  g->pgno || .    
1d160 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d        pg>pPager-
1d170 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21  >origDbSize || !
1d180 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1d190 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70  nal[pg/8]&(1<<(p
1d1a0 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b  g&7))).      ) {
1d1b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
1d1c0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1d1d0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1d1e0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
1d1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d200 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1d210 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
1d220 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d240 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d250 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1d260 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
1d270 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1d280 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1d290 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d2a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d2b0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1d2c0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1d2d0 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
1d2e0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1d2f0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1d300 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1d310 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
1d320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d330 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1d340 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
1d350 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1d360 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
1d370 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
1d380 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d390 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
1d3a0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
1d3b0 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
1d3c0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
1d3d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1d3e0 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
1d3f0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1d400 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1d410 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
1d420 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
1d430 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  rty;.}.#endif..#
1d440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d450 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
1d460 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
1d470 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
1d480 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
1d490 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1d4a0 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
1d4b0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1d4c0 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65  e3PagerOverwrite
1d4d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1d4e0 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
1d4f0 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
1d500 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
1d510 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1d520 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1d530 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20   pgno, &pPg);.  
1d540 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d550 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1d560 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d570 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1d580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d590 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69       memcpy(sqli
1d5a0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
1d5b0 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61  pPg), pData, pPa
1d5c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1d5d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d5e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1d5f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d600 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1d610 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1d620 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1d630 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1d640 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1d650 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
1d660 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
1d670 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61  n page "pgno" ba
1d680 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
1d690 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
1d6a0 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
1d6b0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
1d6c0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
1d6d0 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
1d6e0 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
1d6f0 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
1d700 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
1d710 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1d720 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
1d730 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
1d740 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1d750 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
1d760 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
1d770 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
1d780 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
1d790 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
1d7a0 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
1d7b0 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
1d7c0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1d7d0 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
1d7e0 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
1d7f0 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
1d800 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
1d810 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
1d820 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
1d830 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
1d840 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1d850 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1d860 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
1d870 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
1d880 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
1d890 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
1d8a0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d8b0 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
1d8c0 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
1d8d0 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
1d8e0 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
1d8f0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1d900 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
1d910 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
1d920 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
1d930 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1d940 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
1d950 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
1d960 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
1d970 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
1d980 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
1d990 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
1d9a0 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
1d9b0 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
1d9c0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1d9d0 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
1d9e0 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
1d9f0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1da00 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
1da10 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
1da20 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
1da30 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
1da40 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  ntRollback() rou
1da50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1da60 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
1da70 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
1da80 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  s critical data,
1da90 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1daa0 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
1dab0 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  s.** rolled back
1dac0 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65   in spite of the
1dad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1dae0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  tRollback() call
1daf0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1db00 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1db10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1db20 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1db30 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
1db40 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
1db50 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
1db60 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1db70 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
1db80 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20  Pg!=0 );  /* We 
1db90 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74  never call _dont
1dba0 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68  _write unless th
1dbb0 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d  e page is in mem
1dbc0 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79   */.  pPg->alway
1dbd0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1dbe0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1dbf0 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1dc00 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1dc10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1dc20 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1dc30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1dc40 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1dc50 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1dc60 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1dc70 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1dc80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1dc90 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1dca0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1dcb0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1dcc0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1dcd0 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1dce0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1dcf0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1dd00 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1dd10 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1dd20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1dd30 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1dd40 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1dd50 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1dd60 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1dd70 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1dd80 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1dd90 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1dda0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1ddb0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1ddc0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1ddd0 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1dde0 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1ddf0 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1de00 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1de10 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1de20 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1de30 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1de40 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1de50 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1de60 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1de70 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1de80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1de90 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
1dea0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1deb0 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41   %d\n", pgno, PA
1dec0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1ded0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1dee0 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
1def0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20  pPager, pgno)). 
1df00 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
1df10 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
1df20 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1df30 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
1df40 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1df50 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1df60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1df70 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1df80 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1df90 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1dfa0 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1dfb0 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1dfc0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1dfd0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1dfe0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1dff0 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1e000 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1e010 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1e020 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1e030 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1e040 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1e050 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
1e060 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e070 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50  lback(DbPage *pP
1e080 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1e090 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1e0a0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  r;..  assert( pP
1e0b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1e0c0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1e0d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1e0e0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
1e0f0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
1e100 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1e110 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
1e120 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
1e130 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1e140 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1e150 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1e160 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1e170 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1e180 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e190 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1e1a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1e1b0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1e1c0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1e1d0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1e1e0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1e1f0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
1e200 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1e210 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1e220 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1e230 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1e240 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
1e250 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
1e260 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
1e270 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33  .    PAGERTRACE3
1e280 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  ("DONT_ROLLBACK 
1e290 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
1e2a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
1e2b0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1e2c0 20 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52     IOTRACE(("GAR
1e2d0 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  BAGE %p %d\n", p
1e2e0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1e2f0 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  )).  }.  if( pPa
1e300 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
1e310 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
1e320 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1e330 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
1e340 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
1e350 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1e360 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
1e370 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1e380 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
1e390 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1e3a0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Stmt!=0 );.    p
1e3b0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1e3c0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1e3d0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1e3e0 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f  .    page_add_to
1e3f0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
1e400 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
1e410 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1e420 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
1e430 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
1e440 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
1e450 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
1e460 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
1e470 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
1e480 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e490 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1e4a0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
1e4b0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
1e4c0 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
1e4d0 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
1e4e0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
1e4f0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1e500 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
1e510 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
1e520 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
1e530 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
1e540 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1e550 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
1e560 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
1e570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1e580 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1e590 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e5a0 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
1e5b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e5c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1e5d0 20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68   .    /* Read th
1e5e0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1e5f0 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  at byte 24. */. 
1e600 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
1e610 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  r = retrieve32bi
1e620 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  ts(pPgHdr, 24);.
1e630 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d    .    /* Increm
1e640 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1e650 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1e660 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1e670 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
1e680 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
1e690 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
1e6a0 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
1e6b0 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
1e6c0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1e6d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43 68  .    pPager->iCh
1e6e0 61 6e 67 65 43 6f 75 6e 74 20 3d 20 63 68 61 6e  angeCount = chan
1e6f0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 0a 20  ge_counter;.  . 
1e700 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
1e710 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
1e720 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1e730 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
1e740 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1e750 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1e760 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
1e770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e780 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
1e790 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1e7a0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
1e7b0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
1e7c0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
1e7d0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1e7e0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1e7f0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1e800 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
1e810 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
1e820 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
1e830 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
1e840 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1e850 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
1e860 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
1e870 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1e880 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
1e890 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
1e8a0 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
1e8b0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
1e8c0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1e8d0 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
1e8e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e8f0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1e900 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
1e910 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
1e920 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
1e930 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
1e940 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
1e950 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
1e960 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
1e970 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1e980 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
1e990 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
1e9a0 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
1e9b0 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
1e9c0 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
1e9d0 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
1e9e0 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
1e9f0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1ea00 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
1ea10 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1ea20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
1ea30 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
1ea40 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
1ea50 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
1ea60 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
1ea70 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
1ea80 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
1ea90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1eaa0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1eab0 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ne(Pager *pPager
1eac0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1ead0 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
1eae0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1eaf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41  SQLITE_OK;..  PA
1eb00 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42  GERTRACE4("DATAB
1eb10 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1eb20 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1eb30 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1eb40 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1eb50 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1eb60 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1eb70 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1eb80 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1eb90 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1eba0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1ebb0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1ebc0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ebd0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1ebe0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1ebf0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1ec00 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1ec10 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1ec20 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1ec30 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1ec40 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1ec50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1ec60 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1ec70 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1ec80 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1ec90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1eca0 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1ecb0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1ecc0 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1ecd0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1ece0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1ecf0 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1ed00 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1ed10 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1ed20 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1ed30 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1ed40 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1ed50 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1ed60 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1ed70 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1ed80 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1ed90 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1eda0 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1edb0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1edc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1edd0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1ede0 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1edf0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1ee00 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1ee10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ee20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1ee30 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1ee40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ee50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1ee60 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1ee70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1ee80 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1ee90 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1eea0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1eeb0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1eec0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1eed0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1eee0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1eef0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1ef00 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1ef10 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1ef20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1ef30 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69  gno i;.        i
1ef40 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
1ef50 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1ef60 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
1ef70 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
1ef80 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1ef90 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
1efa0 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
1efb0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
1efc0 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
1efd0 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
1efe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1eff0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1f000 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b  Pager, i, &pPg);
1f010 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f020 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f030 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1f040 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f050 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f060 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ite(pPg);.      
1f070 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f080 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1f090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f0a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1f0b0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1f0c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f0d0 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e    } .      }.#en
1f0e0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77  dif.      rc = w
1f0f0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
1f100 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
1f110 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1f120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1f130 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1f140 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
1f150 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1f160 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f170 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1f180 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23  c_exit;.    }..#
1f190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f1a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f1b0 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1f1c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1f1d0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1f1e0 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
1f1f0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1f200 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1f210 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1f220 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1f230 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
1f240 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
1f250 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f260 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
1f270 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
1f280 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
1f290 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1f2a0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
1f2b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1f2c0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1f2d0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 70 50  ync_exit;.    pP
1f2e0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
1f2f0 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
1f300 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f310 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
1f320 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1f330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f340 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1f350 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  >fd, 0);.    }. 
1f360 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
1f370 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1f380 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
1f390 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1f3a0 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  YNCED;.  }else i
1f3b0 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75  f( MEMDB && nTru
1f3c0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nc!=0 ){.    rc 
1f3d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
1f3e0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
1f3f0 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e  Trunc);.  }..syn
1f400 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e  c_exit:.  return
1f410 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
1f420 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
1f430 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1f440 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
1f450 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
1f460 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
1f470 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
1f480 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
1f490 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
1f4a0 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
1f4b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1f4c0 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
1f4d0 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
1f4e0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
1f4f0 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
1f500 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f510 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
1f520 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f530 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1f540 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1f550 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
1f560 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1f570 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1f580 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
1f590 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
1f5a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f5b0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 50  E_ERROR;.  }.  P
1f5c0 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d  AGERTRACE2("COMM
1f5d0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
1f5e0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1f5f0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
1f600 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
1f610 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
1f620 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
1f630 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
1f640 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
1f650 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1f660 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1f670 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
1f680 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1f690 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
1f6a0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
1f6b0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1f6c0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
1f6d0 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
1f6e0 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
1f6f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
1f700 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
1f710 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1f720 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
1f730 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
1f740 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1f750 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
1f760 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
1f770 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1f780 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1f790 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1f7a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f7b0 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
1f7c0 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
1f7d0 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
1f7e0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
1f7f0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
1f800 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
1f810 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
1f820 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
1f830 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1f840 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
1f850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f860 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1f870 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f880 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
1f890 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
1f8a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f8b0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
1f8c0 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d  NCED || !pPager-
1f8d0 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
1f8e0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1f8f0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1f900 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61  er);.  return pa
1f910 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1f920 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
1f930 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
1f940 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
1f950 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
1f960 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
1f970 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
1f980 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
1f990 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
1f9a0 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
1f9b0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
1f9c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
1f9d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
1f9e0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
1f9f0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
1fa00 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1fa10 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
1fa20 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
1fa30 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f  cking protocol o
1fa40 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
1fa50 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
1fa60 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
1fa70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1fa80 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
1fa90 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
1faa0 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
1fab0 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
1fac0 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
1fad0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
1fae0 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
1faf0 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
1fb00 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
1fb10 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
1fb20 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fb30 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1fb40 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1fb50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1fb60 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45    int rc;.  PAGE
1fb70 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
1fb80 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
1fb90 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1fba0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
1fbb0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1fbc0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
1fbd0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
1fbe0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1fbf0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
1fc00 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
1fc10 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
1fc20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
1fc30 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
1fc40 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
1fc50 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
1fc60 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
1fc70 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
1fc80 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
1fc90 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
1fca0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
1fcb0 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
1fcc0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1fcd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
1fce0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1fcf0 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
1fd00 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1fd10 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
1fd20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
1fd30 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
1fd40 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
1fd50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1fd60 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1fd70 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
1fd80 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
1fd90 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1fda0 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
1fdb0 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  e{.        PAGER
1fdc0 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
1fdd0 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
1fde0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
1fdf0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1fe00 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
1fe10 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
1fe20 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
1fe30 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
1fe40 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
1fe50 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30     p->inStmt = 0
1fe60 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76  ;.      p->pPrev
1fe70 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53  Stmt = p->pNextS
1fe80 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
1fe90 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
1fea0 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
1feb0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1fec0 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
1fed0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
1fee0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1fef0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1ff00 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1ff10 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1ff20 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1ff30 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
1ff40 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1ff50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1ff60 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1ff70 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1ff80 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1ff90 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1ffa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ffb0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1ffc0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
1ffd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ffe0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1fff0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
20000 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
20010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20020 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
20030 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
20040 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
20050 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
20060 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
20070 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
20080 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
20090 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
200a0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
200b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
200c0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
200d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
200e0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
200f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
20100 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
20110 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
20120 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70   0);.    rc2 = p
20130 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
20140 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
20150 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
20170 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
20180 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
20190 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
201a0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
201b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
201c0 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e   -1;..  /* If an
201d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
201e0 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
201f0 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
20200 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
20210 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f  r.  ** cache. So
20220 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
20230 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
20240 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
20250 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69  rror .  ** persi
20260 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65  stent..  */.  re
20270 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
20280 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
20290 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
202a0 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
202b0 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
202c0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
202d0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
202e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
202f0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
20300 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
20310 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
20320 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
20330 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
20340 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
20350 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20360 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
20370 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20380 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
20390 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
203a0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
203b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
203c0 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
203d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
203e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
203f0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
20400 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
20410 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
20420 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
20430 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
20440 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
20450 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
20460 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
20470 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
20480 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
20490 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
204a0 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
204b0 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
204c0 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
204d0 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
204e0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
204f0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
20500 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
20510 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
20520 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
20530 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
20540 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
20550 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
20560 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
20570 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
20580 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
20590 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
205a0 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
205b0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
205c0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
205d0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
205e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
205f0 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
20600 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
20610 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
20620 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
20630 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
20640 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
20650 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
20660 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
20670 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
20680 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
20690 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
206a0 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
206b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
206c0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
206d0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
206e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
206f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
20700 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
20710 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
20720 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
20730 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
20740 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
20750 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
20760 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
20770 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
20780 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
20790 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
207a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
207b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
207c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
207d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
207e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
207f0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
20800 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20810 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
20820 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
20830 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
20840 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
20850 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
20860 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
20870 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
20880 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
20890 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
208a0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
208b0 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
208c0 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
208d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
208e0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
208f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20900 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
20910 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
20920 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
20930 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
20940 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
20950 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20960 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50  >stmtJSize == pP
20970 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20980 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61   );.#endif.  pPa
20990 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
209a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
209b0 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
209c0 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
209d0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
209e0 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
209f0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
20a00 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
20a10 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
20a20 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
20a30 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
20a40 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
20a50 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73  ntemp(&pPager->s
20a60 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
20a70 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
20a80 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
20a90 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
20aa0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
20ab0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
20ac0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
20ad0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
20ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20af0 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
20b00 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
20b10 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
20b20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
20b30 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
20b40 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
20b50 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
20b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20b70 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
20b80 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
20b90 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
20ba0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
20bb0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
20bc0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
20bd0 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
20be0 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52  pNext;.    PAGER
20bf0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
20c00 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
20c10 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
20c20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
20c30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
20c40 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
20c50 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
20c60 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
20c70 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
20c80 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
20c90 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
20ca0 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
20cb0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
20cc0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
20cd0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
20ce0 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
20cf0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
20d00 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
20d10 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
20d20 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
20d30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
20d40 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
20d50 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
20d60 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
20d70 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   0;.      if( ME
20d80 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
20d90 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
20da0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
20db0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
20dc0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
20dd0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
20de0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
20df0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
20e00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
20e10 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
20e20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
20e30 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
20e40 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
20e50 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
20e60 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
20e70 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
20e80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20e90 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
20ea0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
20eb0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
20ec0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
20ed0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
20ee0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20ef0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
20f00 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
20f10 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
20f20 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20f30 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
20f40 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
20f50 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
20f60 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
20f70 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
20f80 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
20f90 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
20fa0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
20fb0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
20fc0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
20fd0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
20fe0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
20ff0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
21000 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
21010 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
21020 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
21030 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
21040 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
21050 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
21060 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
21070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
21080 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
21090 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
210a0 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
210b0 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
210c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
210d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
210e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
210f0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
21100 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
21110 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
21120 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
21130 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21150 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
21160 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
21170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21180 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21190 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
211a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
211b0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
211c0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
211d0 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
211e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
211f0 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
21200 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
21210 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
21220 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
21230 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
21240 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
21250 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65  agerDirname(Page
21260 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21270 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
21280 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
21290 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
212a0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
212b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
212c0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
212d0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
212e0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
212f0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
21300 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
21310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21320 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
21330 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
21340 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
21350 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
21360 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
21370 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
21380 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
21390 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
213a0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
213b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
213c0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
213d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
213e0 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
213f0 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
21400 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
21410 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21420 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
21430 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
21440 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
21450 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
21460 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
21470 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
21480 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
21490 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
214a0 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
214b0 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g;.}.#endif..#if
214c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
214d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
214e0 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
214f0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
21500 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  ata to location 
21510 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
21520 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
21530 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
21540 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72  nces to the curr
21550 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49  ent page pgno. I
21560 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a  f current page.*
21570 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  * pgno is not al
21580 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c  ready in the rol
21590 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
215a0 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  t is not written
215b0 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20   there by.** by 
215c0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68  this routine. Th
215d0 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74  e same applies t
215e0 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61  o the page pData
215f0 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e   refers to on en
21600 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  try to.** this r
21610 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
21620 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
21630 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20  page refered to 
21640 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20  by pData remain 
21650 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
21660 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
21670 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21680 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65   page pData (i.e
21690 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
216a0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
216b0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
216c0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
216d0 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
216e0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
216f0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
21700 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
21710 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
21720 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
21730 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
21740 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
21750 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
21760 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
21770 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
21780 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
21790 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
217a0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
217b0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
217c0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
217d0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
217e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
217f0 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
21800 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
21810 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
21820 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
21830 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
21840 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20  Hdr *pPgOld; .  
21850 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65  int h;.  Pgno ne
21860 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
21870 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
21880 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47  nRef>0 );..  PAG
21890 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25  ERTRACE5("MOVE %
218a0 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
218b0 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
218c0 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
218d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
218e0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
218f0 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
21900 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
21910 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
21920 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21930 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66 28 20  , pgno))..  if( 
21940 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
21950 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
21960 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
21970 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
21980 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
21990 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
219a0 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
219b0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
219c0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
219d0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
219e0 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
219f0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
21a00 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
21a10 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
21a20 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
21a30 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
21a40 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
21a50 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
21a60 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
21a70 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
21a80 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
21a90 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
21aa0 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
21ab0 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
21ac0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
21ad0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
21ae0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
21af0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
21b00 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
21b10 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
21b20 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
21b30 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
21b40 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
21b50 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
21b60 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
21b70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
21b80 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
21b90 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70  gOld);.    if( p
21ba0 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
21bb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21bc0 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
21bd0 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
21be0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
21bf0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
21c00 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
21c10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21c20 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
21c30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
21c40 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
21c50 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
21c60 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
21c70 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
21c80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67   */.  assert( pg
21c90 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  no!=0 );.  pPg->
21ca0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
21cb0 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
21cc0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69  r->nHash-1);.  i
21cd0 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
21ce0 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [h] ){.    asser
21cf0 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
21d00 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  [h]->pPrevHash==
21d10 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
21d20 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
21d30 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Hash = pPg;.  }.
21d40 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
21d50 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
21d60 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  [h];.  pPager->a
21d70 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
21d80 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
21d90 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74  = 0;..  makeDirt
21da0 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
21db0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
21dc0 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
21dd0 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
21de0 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
21df0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
21e00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
21e10 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
21e20 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
21e30 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
21e40 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
21e50 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
21e60 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
21e70 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
21e80 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
21e90 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
21ea0 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
21eb0 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e      ** Pager.aIn
21ec0 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
21ed0 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
21ee0 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
21ef0 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
21f00 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
21f10 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
21f20 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
21f30 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
21f40 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
21f50 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
21f60 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
21f70 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
21f80 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
21f90 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
21fa0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
21fb0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21fc0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
21fd0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
21fe0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
21ff0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22000 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
22010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
22020 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
22030 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
22040 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
22050 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
22070 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
22080 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
22090 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
220a0 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75     pPgHdr->inJou
220b0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61  rnal = 1;.    ma
220c0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
220d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
220e0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
220f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
22100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
22110 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
22120 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
22130 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
22140 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
22150 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
22160 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
22170 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
22180 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
22190 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
221a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
221b0 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
221c0 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
221d0 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
221e0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
221f0 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
22200 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
22210 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
22220 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
22230 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
22240 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
22250 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
22260 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54  ger?PGHDR_TO_EXT
22270 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a  RA(pPg, pPager):
22280 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
22290 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
222a0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
222b0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
222c0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
222d0 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
222e0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
222f0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22300 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
22310 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22320 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
22330 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
22340 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
22350 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
22360 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
22370 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
22380 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
22390 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
223a0 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
223b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
223c0 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
223d0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
223e0 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
223f0 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
22400 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
22410 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
22420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
22430 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
22440 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22450 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
22460 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
22470 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
22480 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
22490 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
224a0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
224b0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
224c0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
224d0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
224e0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
224f0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22500 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
22510 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
22520 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22530 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
22540 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
22550 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
22560 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
22570 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
22580 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
22590 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64  usiveMode = eMod
225a0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
225b0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
225c0 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23  lusiveMode;.}..#
225d0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
225e0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
225f0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
22600 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22610 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
22620 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
22630 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
22640 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
22650 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
22660 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
22670 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
22680 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
22690 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
226a0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
226b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
226c0 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20  Lockstate(Pager 
226d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
226e0 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  rn sqlite3OsLock
226f0 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  State(pPager->fd
22700 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
22710 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
22720 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
22730 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
22740 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
22750 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
22760 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
22770 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28  te3PagerRefdump(
22780 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22790 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
227a0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
227b0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
227c0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
227d0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
227e0 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
227f0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22800 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  Printf("PAGE %3d
22810 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
22820 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
22830 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
22840 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
22850 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65  >nRef);.  }.}.#e
22860 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ndif..#endif /* 
22870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
22880 49 4f 20 2a 2f 0a                                IO */.