/ Hex Artifact Content
Login

Artifact d0bd990ade9062ec1884a4c4e138f464e18e9250:


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: 35 20 32 30 30 37 2f 30 34 2f 30 37 20 31 35 3a  5 2007/04/07 15:
0360: 30 33 3a 31 37 20 64 61 6e 69 65 6c 6b 31 39 37  03:17 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 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1b40: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1b50: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b60: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1b70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1b80: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
1bb0: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
1bc0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
1bd0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf0: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
1c00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
1c10: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
1c20: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
1c40: 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  able DontRollbac
1c50: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
1c60: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74  e */.  short int
1c70: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
1c80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c90: 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73  of users of this
1ca0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
1cb0: 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76   *pDirty, *pPrev
1cc0: 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72  Dirty;    /* Dir
1cd0: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33  ty pages */.  u3
1ce0: 32 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  2 notUsed;      
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 42 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a  Buffer space */.
1d10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1d20: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
1d30: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
1d40: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61  .  /* pPager->pa
1d50: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1d60: 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77  page data follow
1d70: 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a   this header */.
1d80: 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72    /* Pager.nExtr
1d90: 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c  a bytes of local
1da0: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65   data follow the
1db0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b   page data */.};
1dc0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ../*.** For an i
1dd0: 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61  n-memory only da
1de0: 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74  tabase, some ext
1df0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
1e00: 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74  s recorded about
1e10: 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f  .** each page so
1e20: 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61   that changes ca
1e30: 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1e40: 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .  (Journal file
1e50: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65  s are not.** use
1e60: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
1e70: 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65  databases.)  The
1e80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72   following infor
1e90: 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20  mation is added 
1ea0: 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  to.** the end of
1eb0: 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f   every EXTRA blo
1ec0: 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ck for in-memory
1ed0: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
1ee0: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
1ef0: 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  on could have be
1f00: 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c  en added directl
1f10: 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73  y to the PgHdr s
1f20: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74  tructure..** But
1f30: 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74   then it would t
1f40: 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20  ake up an extra 
1f50: 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61  8 bytes of stora
1f60: 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64  ge on every PgHd
1f70: 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69  r.** even for di
1f80: 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  sk-based databas
1f90: 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69  es.  Splitting i
1fa0: 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79  t out saves 8 by
1fb0: 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  tes.  This.** is
1fc0: 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20   only a savings 
1fd0: 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73  of 0.8% but thos
1fe0: 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64  e percentages ad
1ff0: 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  d up..*/.typedef
2000: 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72   struct PgHistor
2010: 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72  y PgHistory;.str
2020: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a  uct PgHistory {.
2030: 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20    u8 *pOrig;    
2040: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67   /* Original pag
2050: 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65  e text.  Restore
2060: 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75   to this on a fu
2070: 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ll rollback */. 
2080: 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20   u8 *pStmt;     
2090: 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61  /* Text as it wa
20a0: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
20b0: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
20c0: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  t statement */. 
20d0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d   PgHdr *pNextStm
20e0: 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20  t, *pPrevStmt;  
20f0: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
2100: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
2110: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  t journal */.  u
2120: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2140: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
2150: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2160: 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  rnal */.};../*.*
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 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
4630: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61  eturn true if pa
4640: 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65  ge *pPg has alre
4650: 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
4660: 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
4670: 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72  t.** journal (or
4680: 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73   statement snaps
4690: 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65  hot has been cre
46a0: 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73  ated, if *pPg is
46b0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69   part.** of an i
46c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
46d0: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
46e0: 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e  t pageInStatemen
46f0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
4700: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
4710: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
4720: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
4730: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
4740: 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
4750: 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65  r)->inStmt;.  }e
4760: 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  lse{.    Pgno pg
4770: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
4780: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67      u8 *a = pPag
4790: 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20  er->aInStmt;.   
47a0: 20 72 65 74 75 72 6e 20 28 61 20 26 26 20 28 69   return (a && (i
47b0: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
47c0: 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b  >stmtSize && (a[
47d0: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
47e0: 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d  gno&7))));.  }.}
47f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4800: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4810: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4820: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
4830: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
4840: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
4850: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
4860: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
4870: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
4880: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
4890: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
48a0: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
48b0: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73  1))==0 );.  aHas
48c0: 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  h = sqliteMalloc
48d0: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
48e0: 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48  ])*N );.  if( aH
48f0: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
4900: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
4910: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
4920: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
4930: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
4940: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
4950: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4960: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
4970: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
4980: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
4990: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
49a0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
49b0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
49c0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
49d0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
49e0: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
49f0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4a00: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
4a10: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
4a20: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
4a30: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4a40: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
4a50: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
4a60: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
4a70: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
4a80: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
4a90: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
4aa0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
4ab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
4ac0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
4ad0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
4ae0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
4af0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4b00: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
4b10: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4b20: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4b30: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4b40: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4b50: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4b60: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
4b70: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
4b80: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
4b90: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4ba0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
4bb0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
4bc0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
4bd0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
4be0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
4bf0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4c00: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
4c10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4c20: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4c30: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4c40: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29   ac, sizeof(ac))
4c50: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4c60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4c70: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4c80: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4c90: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4ca0: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [3];.  }.  retur
4cb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
4cc0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4cd0: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
4ce0: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
4cf0: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
4d00: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
4d10: 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63 68  oid put32bits(ch
4d20: 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29  ar *ac, u32 val)
4d30: 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  {.  ac[0] = (val
4d40: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4d50: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4d60: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4d70: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4d80: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4d90: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4da0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4db0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
4dc0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
4dd0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
4de0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
4df0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
4e00: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4e10: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4e20: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4e30: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4e40: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4e50: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4e60: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4e70: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4e80: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4e90: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4ea0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4eb0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4ec0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4ed0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4ee0: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4ef0: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4f00: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4f10: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4f20: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4f30: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4f40: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4f50: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4f60: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4f70: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4f80: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4f90: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4fa0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4fb0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4fc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4fd0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4fe0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4ff0: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
5000: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
5010: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5020: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
5030: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
5040: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
5050: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
5060: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
5070: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
5080: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
5090: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
50a0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
50b0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
50c0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
50d0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
50e0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
50f0: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
5100: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
5110: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
5120: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
5130: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
5140: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
5150: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
5160: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
5170: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
5180: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
5190: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
51a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
51b0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
51c0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
51d0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
51e0: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
51f0: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
5200: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
5210: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
5220: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
5230: 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d  .  if(.    rc2==
5240: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
5250: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
5260: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
5270: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a  =SQLITE_CORRUPT.
5280: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
5290: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
52a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
52b0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
52c0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
52d0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
52e0: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
52f0: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
5300: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
5310: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
5320: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
5330: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
5340: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5350: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 20  ned char *pData 
5360: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5370: 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   *)PGHDR_TO_DATA
5380: 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69  (pPage);.  for(i
5390: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61  =0; i<pPage->pPa
53a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69  ger->pageSize; i
53b0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
53c0: 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69  (hash+i)^pData[i
53d0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
53e0: 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hash;.}../*.** T
53f0: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
5400: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
5410: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
5420: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
5430: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
5440: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
5450: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
5460: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
5470: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
5480: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
5490: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
54a0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
54b0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
54c0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
54d0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
54e0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
54f0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5500: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
5510: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
5520: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
5530: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
5540: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
5550: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
5560: 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d  || MEMDB || pPg-
5570: 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20  >dirty || .     
5580: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
5590: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
55a0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
55b0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
55c0: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
55d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
55e0: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
55f0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5600: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
5610: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
5620: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5630: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
5640: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
5650: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
5660: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
5670: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
5680: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
5690: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
56a0: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
56b0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
56c0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
56d0: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
56e0: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
56f0: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
5700: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
5710: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5720: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
5730: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
5740: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
5750: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
5760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5770: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5780: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
5790: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
57a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
57b0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
57c0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
57d0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
57e0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
57f0: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5800: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5810: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5820: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5830: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5840: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5850: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5860: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
5870: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
5880: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5890: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
58a0: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
58b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
58c0: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
58d0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
58e0: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
58f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5900: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5910: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5920: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5930: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5940: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5950: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5960: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5970: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
5980: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
5990: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
59a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
59b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
59c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
59d0: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
59e0: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
59f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5a00: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5a10: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5a20: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5a30: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5a40: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5a50: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5a60: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5a70: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
5a80: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
5a90: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5aa0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
5ab0: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
5ac0: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
5ad0: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5ae0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5af0: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5b00: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5b10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5b20: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5b30: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5b40: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5b50: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5b60: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5b70: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
5b80: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
5b90: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
5ba0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
5bb0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
5bc0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
5bd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5be0: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5bf0: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5c00: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5c10: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5c20: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5c30: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5c40: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5c50: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5c60: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5c70: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5c80: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5c90: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
5cb0: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
5cc0: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5cd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5cf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d00: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5d10: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5d20: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5d30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5d40: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5d50: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5d60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
5d70: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
5d80: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
5d90: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
5da0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
5db0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
5dc0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
5dd0: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
5de0: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
5df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5e10: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
5e30: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5e50: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5e70: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
5e90: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
5ea0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
5eb0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5ec0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5ed0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5ee0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5ef0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5f00: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5f10: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5f20: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5f30: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5f40: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5f50: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5f60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5f70: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5f80: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5f90: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5fa0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5fb0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5fc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5fd0: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
5fe0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5ff0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
6000: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
6010: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
6020: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
6030: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
6040: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
6050: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
6060: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
6070: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
6080: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
6090: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
60a0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
60b0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
60c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
60d0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
60e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
60f0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
6100: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
6110: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
6120: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
6130: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
6140: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
6150: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
6160: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
6170: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6180: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
6190: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
61a0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
61b0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
61c0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
61d0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
61e0: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
61f0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6200: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6210: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
6220: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
6230: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
6240: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
6250: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
6260: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
6270: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
6280: 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72  {.  char zHeader
6290: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
62a0: 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e  Magic)+16];.  in
62b0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
62c0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
62d0: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
62e0: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
62f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6300: 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  f;.  }..  rc = s
6310: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6320: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6330: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6340: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6350: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
6360: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
6370: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
6380: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6390: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
63a0: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
63b0: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
63c0: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
63d0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
63e0: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
63f0: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
6400: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
6410: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
6420: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
6430: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
6440: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
6450: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
6460: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
6470: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
6480: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
6490: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
64a0: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
64b0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  */.  memcpy(zHea
64c0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
64d0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
64e0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a  nalMagic));.  /*
64f0: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
6500: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
6510: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
6520: 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
6530: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6540: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
6550: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
6560: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
6570: 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e  0);.  /* The ran
6580: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
6590: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
65a0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
65b0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
65c0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
65d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
65e0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
65f0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6600: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6610: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6620: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6630: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6640: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6650: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6660: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6670: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
6680: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
6690: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
66a0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
66b0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
66c0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
66d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
66e0: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
66f0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
6700: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
6710: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
6720: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
6730: 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66  urnalHdr, sizeof
6740: 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63  (zHeader))).  rc
6750: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6760: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6770: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
6780: 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20  Header));..  /* 
6790: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
67a0: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
67b0: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
67c0: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
67d0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
67e0: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
67f0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6800: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
6810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6830: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
6840: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
6850: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6860: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
6870: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6880: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6890: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
68a0: 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ff-1);.    if( r
68b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
68c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
68d0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
68e0: 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31  ->jfd, "\000", 1
68f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6900: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6910: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6920: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6930: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
6940: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
6950: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
6960: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6970: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
6980: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
6990: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
69a0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
69b0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
69c0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
69d0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
69e0: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
69f0: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
6a00: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
6a10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
6a20: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
6a30: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
6a40: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6a50: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
6a60: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
6a70: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
6a80: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
6a90: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
6aa0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
6ab0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
6ac0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
6ad0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
6ae0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6af0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
6b00: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
6b10: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
6b20: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
6b30: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
6b40: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
6b50: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
6b60: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
6b70: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
6b80: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
6b90: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
6ba0: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
6bb0: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
6bc0: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
6bd0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
6be0: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
6bf0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6c00: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
6c10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6c30: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
6c40: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
6c50: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
6c60: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
6c70: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
6c80: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
6c90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6ca0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
6cb0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6cc0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6cd0: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
6ce0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6cf0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6d00: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6d10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6d20: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6d30: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6d40: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6d50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6d60: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
6d70: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
6d80: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
6d90: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6da0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6db0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
6dc0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
6dd0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6de0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
6df0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6e00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6e10: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6e20: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6e30: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6e40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6e50: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6e60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
6e70: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6e80: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6e90: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6ea0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6eb0: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
6ec0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6ed0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
6ee0: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
6ef0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
6f00: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
6f10: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
6f20: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
6f30: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
6f40: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
6f50: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
6f60: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
6f70: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
6f80: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
6f90: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
6fa0: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
6fb0: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
6fc0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
6fd0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
6fe0: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
6ff0: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
7000: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
7010: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
7020: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
7030: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
7040: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
7050: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
7060: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7070: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
7080: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
7090: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
70a0: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
70b0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
70c0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
70d0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
70e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
70f0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
7100: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
7110: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
7120: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7130: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
7140: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
7150: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
7160: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7170: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
7180: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
7190: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
71a0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
71b0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
71c0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
71d0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
71e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
71f0: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
7200: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
7210: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
7220: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
7230: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
7240: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
7250: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
7260: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
7270: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
7280: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
7290: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
72a0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
72b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
72c0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
72d0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
72e0: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
72f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7300: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
7310: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
7320: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
7330: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
7340: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
7350: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
7360: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
7370: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
7380: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
7390: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
73a0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
73b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
73c0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
73d0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
73e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
73f0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
7400: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
7410: 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b  int i; .  u32 ck
7420: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
7430: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
7440: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
7450: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
7460: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
7470: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
7480: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
7490: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
74a0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
74b0: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
74c0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
74d0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
74e0: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
74f0: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
7500: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
7510: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
7520: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
7530: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
7540: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7550: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
7560: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
7570: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
7580: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
7590: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
75a0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
75b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
75c0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
75d0: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
75e0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
75f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7600: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7610: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
7620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7630: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
7640: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
7650: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
7660: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
7670: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7680: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7690: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
76a0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
76b0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
76c0: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
76d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
76e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32  urn rc;..  put32
76f0: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7700: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
7710: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
7720: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
7730: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7740: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7750: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
7760: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7770: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
7780: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
7790: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
77a0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
77b0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
77c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
77d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
77e0: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
77f0: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
7800: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
7810: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
7820: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
7830: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
7840: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
7850: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
7860: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
7870: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
7880: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
7890: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
78a0: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
78b0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
78c0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
78d0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
78e0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
78f0: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7900: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7910: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7920: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7930: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7940: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7950: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7960: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7970: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
7980: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48  g->pPager;.  PgH
7990: 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
79a0: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
79b0: 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73  g, pPager);.  as
79c0: 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20  sert( MEMDB );. 
79d0: 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53   if( !pHist->inS
79e0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
79f0: 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53  t( pHist->pPrevS
7a00: 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d  tmt==0 && pHist-
7a10: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b  >pNextStmt==0 );
7a20: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7a30: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
7a40: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
7a50: 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61  ager->pStmt, pPa
7a60: 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20  ger)->pPrevStmt 
7a70: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7a80: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
7a90: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
7aa0: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
7ab0: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Stmt = pPg;.    
7ac0: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
7ad0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
7ae0: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
7af0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
7b00: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
7b10: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
7b20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7b30: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
7b40: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
7b50: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
7b60: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
7b70: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
7b80: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
7b90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
7ba0: 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e  Hash==0 ) return
7bb0: 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72   0;.  p = pPager
7bc0: 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28  ->aHash[pgno & (
7bd0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
7be0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
7bf0: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
7c00: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
7c10: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
7c20: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7c30: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
7c40: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7c50: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7c60: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
7c70: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
7c80: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
7c90: 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ode ){.    if( !
7ca0: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
7cb0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
7cc0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
7cd0: 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  CK);.      pPage
7ce0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
7cf0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
7d00: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
7d10: 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20  ager)).    }.   
7d20: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7d30: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
7d40: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
7d50: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
7d60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
7d70: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
7d80: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
7d90: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
7da0: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
7db0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
7dc0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
7dd0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
7de0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a  ready entered.**
7df0: 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
7e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7e10: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
7e20: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
7e30: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43  ){.  if( p->errC
7e40: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
7e50: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
7e60: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
7e70: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
7e80: 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  en==0 );.  if( p
7e90: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
7ea0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
7eb0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
7ec0: 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61  ack(p);.  }.  pa
7ed0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20  ger_unlock(p);. 
7ee0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
7ef0: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
7f00: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
7f10: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
7f20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
7f30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
7f40: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
7f50: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
7f60: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a  siveMode );.}...
7f70: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
7f80: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
7f90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
7fa0: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
7fb0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
7fc0: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
7fd0: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
7fe0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
7ff0: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
8000: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
8010: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
8020: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
8030: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
8040: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
8050: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
8060: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
8070: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
8080: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
8090: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
80a0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
80b0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
80c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
80d0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
80e0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
80f0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
8100: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
8110: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
8120: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
8130: 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  >pStmt = 0;.  pP
8140: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
8150: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
8160: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
8170: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
8180: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
8190: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
81a0: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
81b0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
81c0: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
81d0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
81e0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
81f0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
8200: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
8210: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
8220: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
8230: 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20    A transaction 
8240: 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68  is ended by eith
8250: 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f  er.** a COMMIT o
8260: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a  r a ROLLBACK..**
8270: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
8280: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
8290: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
82a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
82b0: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
82c0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
82d0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
82e0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
82f0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c  routine will rel
8300: 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  ease.** the data
8310: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
8320: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
8330: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
8340: 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20  e if that is.** 
8350: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8360: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65  thing to do.  Re
8370: 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61  lease locks usua
8380: 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61  lly is appropria
8390: 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65  te,.** unless we
83a0: 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76   are in exclusiv
83b0: 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72  e access mode or
83c0: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
83d0: 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44  a .** COMMIT AND
83e0: 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41   BEGIN or ROLLBA
83f0: 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65  CK AND BEGIN ope
8400: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
8410: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
8420: 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64  s either deleted
8430: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a   or truncated..*
8440: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
8450: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
8460: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8470: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
8480: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
8490: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
84a0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
84b0: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
84c0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
84d0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
84e0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
84f0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
8500: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
8510: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
8520: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
8530: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
8540: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8550: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
8560: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21  _OK;.  assert( !
8570: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
8580: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
8590: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
85a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
85b0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
85c0: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
85d0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
85e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
85f0: 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78  n && !pPager->ex
8600: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
8610: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8620: 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
8630: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
8640: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
8650: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
8660: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
8670: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
8680: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
8690: 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73        && (rc = s
86a0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
86b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
86c0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b  )==SQLITE_OK ){;
86d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
86e0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
86f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
8700: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
8710: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
8720: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
8730: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
8740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8750: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
8760: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
8770: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8780: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
8790: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
87a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
87b0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
87c0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
87d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
87e0: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
87f0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
8800: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
8810: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
8820: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
8830: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
8840: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
8850: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
8860: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
8870: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
8880: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
8890: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
88a0: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
88b0: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
88c0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
88d0: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
88e0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
88f0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
8900: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
8910: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
8920: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
8930: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
8940: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
8950: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8960: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8970: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
8980: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8990: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
89a0: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
89b0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
89c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
89d0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
89e0: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
89f0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
8a00: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
8a10: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
8a20: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
8a30: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
8a40: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
8a50: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
8a60: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
8a70: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8a80: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
8a90: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
8aa0: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
8ab0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8ac0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
8ad0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
8ae0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
8af0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
8b00: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
8b10: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
8b20: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
8b30: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
8b40: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8b50: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8b60: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8b70: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8b80: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8b90: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8ba0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8bb0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8bc0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8bd0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8be0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8bf0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
8c00: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
8c10: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
8c20: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
8c30: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
8c40: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
8c50: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8c60: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8c70: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8c80: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8c90: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8ca0: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8cb0: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8cc0: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8cd0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8ce0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8cf0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
8d00: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
8d10: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
8d20: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
8d30: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
8d40: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
8d50: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
8d60: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
8d70: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
8d80: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
8d90: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
8da0: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8db0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8dc0: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8dd0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8de0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
8df0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
8e00: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
8e10: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
8e20: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
8e30: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
8e40: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
8e50: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
8e60: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
8e70: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
8e80: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
8e90: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
8ea0: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8eb0: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8ec0: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8ed0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8ee0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
8ef0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
8f00: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
8f10: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
8f20: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
8f30: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
8f40: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
8f50: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8f60: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
8f70: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
8f80: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
8f90: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
8fa0: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
8fb0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
8fc0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8fd0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8fe0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
8ff0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
9000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
9010: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
9020: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
9030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
9040: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
9050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
9060: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
9070: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9080: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
9090: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
90a0: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
90b0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
90c0: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
90d0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
90e0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
90f0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
9100: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
9110: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
9120: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
9130: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
9140: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
9150: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
9160: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
9170: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
9180: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
9190: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
91a0: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
91b0: 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b   *jfd, int useCk
91c0: 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sum){.  int rc;.
91d0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
9200: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
9210: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
9240: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
9250: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
9260: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9280: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
9290: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
92a0: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
92b0: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
92c0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
92d0: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
92e0: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
92f0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
9300: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
9310: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
9320: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
9330: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
9340: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
9350: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
9360: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
9370: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
9380: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
9390: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
93a0: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
93b0: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
93c0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
93d0: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
93e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
93f0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
9400: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9410: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
9420: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9430: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
9440: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
9450: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
9460: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
9470: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
9480: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
9490: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
94a0: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
94b0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
94c0: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
94d0: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
94e0: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
94f0: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
9500: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9510: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
9520: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
9530: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
9540: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
9550: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
9560: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
9570: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
9580: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
9590: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
95a0: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
95b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
95c0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
95d0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
95e0: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
95f0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
9600: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
9610: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
9620: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
9630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9640: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
9650: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
9660: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
9670: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
9680: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9690: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
96a0: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
96b0: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
96c0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
96d0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
96e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
96f0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
9700: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9710: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
9720: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
9730: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9740: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
9750: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9760: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
9770: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
9780: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
9790: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
97a0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
97b0: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
97c0: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
97d0: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
97e0: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
97f0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
9800: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
9810: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
9820: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
9830: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
9840: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
9850: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9860: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
9870: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
9880: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
9890: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
98a0: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
98b0: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
98c0: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
98d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
98e0: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
98f0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
9900: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
9910: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
9920: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
9930: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
9940: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
9950: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
9960: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
9970: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
9980: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
9990: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
99a0: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
99b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
99c0: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
99d0: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
99e0: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
99f0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
9a00: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
9a10: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
9a20: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
9a30: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
9a40: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
9a50: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f  e in the main ro
9a60: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
9a70: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
9a80: 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42   if a full ROLLB
9a90: 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72  ACK occurs after
9aa0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
9ab0: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   ** rollback the
9ac0: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77   full ROLLBACK w
9ad0: 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20  ill not restore 
9ae0: 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20  the page to its 
9af0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f  original.  ** co
9b00: 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64  ntent.  Two cond
9b10: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
9b20: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
9b30: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
9b40: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31  e.  ** files. (1
9b50: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
9b60: 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20  ust be locked.  
9b70: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
9b80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
9b90: 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ** page content 
9ba0: 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  is in the main j
9bb0: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
9bc0: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
9bd0: 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61  s not in.  ** ca
9be0: 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69  che or else it i
9bf0: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
9c00: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
9c10: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
9c20: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
9c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9c40: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
9c50: 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
9c60: 67 21 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g!=0 );.  PAGERT
9c70: 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20  RACE3("PLAYBACK 
9c80: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
9c90: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
9ca0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
9cb0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9cc0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
9cd0: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
9ce0: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
9cf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9d00: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
9d10: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
9d20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9d30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9d40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9d50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9d60: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
9d70: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9d80: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9d90: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  }.    if( pPg ){
9da0: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
9db0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
9dc0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
9dd0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
9de0: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
9df0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
9e00: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
9e10: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
9e20: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
9e30: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
9e40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
9e50: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
9e60: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
9e70: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
9e80: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
9e90: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
9ea0: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
9eb0: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
9ec0: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
9ed0: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
9ee0: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
9ef0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
9f00: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
9f10: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
9f20: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
9f30: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
9f40: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
9f50: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
9f60: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
9f70: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
9f80: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
9f90: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9fa0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9fb0: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20  xDestructor ){  
9fc0: 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68  /*** FIX ME:  Sh
9fd0: 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65  ould this be xRe
9fe0: 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20  init? ***/.     
9ff0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
a000: 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
a010: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a020: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a030: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
a040: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
a050: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
a060: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
a070: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
a080: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
a090: 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 3);..    /* If
a0a0: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
a0b0: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
a0c0: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
a0d0: 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 2a  r.iChangeCount *
a0e0: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
a0f0: 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  1 ){.      pPage
a100: 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20  r->iChangeCount 
a110: 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
a120: 28 70 50 67 2c 20 32 34 29 3b 0a 20 20 20 20 7d  (pPg, 24);.    }
a130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
a150: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
a160: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
a170: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a180: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
a190: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
a1a0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
a1b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a1c0: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
a1d0: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
a1e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a1f0: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
a200: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
a210: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
a220: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
a230: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
a240: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
a250: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a260: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
a270: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
a280: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
a290: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
a2a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
a2b0: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
a2c0: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
a2d0: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
a2e0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
a2f0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
a300: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
a310: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
a320: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
a330: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
a340: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
a350: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
a360: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a370: 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74  _delmaster(const
a380: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
a390: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
a3a0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
a3b0: 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74  ;.  OsFile *mast
a3c0: 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
a3d0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
a3e0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
a3f0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
a400: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
a410: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
a420: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
a430: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a440: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
a450: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
a460: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
a470: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
a480: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
a490: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
a4a0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
a4b0: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
a4c0: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
a4d0: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
a4e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
a4f0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d  sOpenReadOnly(zM
a500: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b  aster, &master);
a510: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
a520: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 61 73 74  QLITE_OK || mast
a530: 65 72 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er );.  if( rc!=
a540: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a550: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a560: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
a570: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
a580: 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74  3OsFileSize(mast
a590: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
a5a0: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
a5b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a5c0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a5d0: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
a5e0: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
a5f0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
a600: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
a610: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
a620: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
a630: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a640: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
a650: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
a660: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
a670: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
a680: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
a690: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
a6a0: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
a6b0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
a6c0: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
a6d0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
a6e0: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
a6f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
a700: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a710: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a720: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
a730: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a740: 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73  ead(master, zMas
a750: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
a760: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a770: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a780: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
a790: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
a7a0: 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
a7b0: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
a7c0: 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
a7d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
a7e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
a7f0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a800: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a  3OsFileExists(zJ
a810: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
a820: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
a830: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
a840: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
a850: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
a860: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
a870: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
a880: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
a890: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a8a0: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
a8b0: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
a8c0: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
a8d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a8e0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
a8f0: 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65  /.        OsFile
a900: 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20   *journal = 0;. 
a910: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20         int c;.. 
a920: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a930: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
a940: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
a950: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 61  rnal);.        a
a960: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a970: 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72 6e 61 6c 20  E_OK || journal 
a980: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
a990: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a9a0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
a9b0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a9c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
a9d0: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
a9e0: 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c  Journal(journal,
a9f0: 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20   &zMasterPtr);. 
aa00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
aa10: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
aa20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
aa30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
aa40: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
aa50: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
aa60: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
aa70: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30   = zMasterPtr!=0
aa80: 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
aa90: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
aaa0: 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  =0;.        sqli
aab0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74  teFree(zMasterPt
aac0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
aad0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
aae0: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
aaf0: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
ab00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ab10: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
ab20: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
ab30: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
ab40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ab50: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
ab60: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
ab70: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
ab80: 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
ab90: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
aba0: 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
abb0: 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
abc0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
abd0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
abe0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
abf0: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
ac00: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
ac10: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
ac20: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ac30: 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a  rc;.}..#if 0./*.
ac40: 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61  ** Make every pa
ac50: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
ac60: 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74 20  agree with what 
ac70: 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20  is on disk.  In 
ac80: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20  other words,.** 
ac90: 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b 20  reread the disk 
aca0: 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
acb0: 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e  te of the cache.
acc0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
acd0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
ace0: 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ter a rollback i
acf0: 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20  n which some of 
ad00: 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65 0a  the dirty cache.
ad10: 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65 76  ** pages had nev
ad20: 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
ad30: 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65  out to disk.  We
ad40: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61   need to roll ba
ad50: 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20  ck the.** cache 
ad60: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
ad70: 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 64  easiest way to d
ad80: 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65 72  o that is to rer
ad90: 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74  ead the old cont
ada0: 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d  ent.** back from
adb0: 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74   the disk..*/.st
adc0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72  atic int pager_r
add0: 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65  eload_cache(Page
ade0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
adf0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
ae00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ae10: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
ae20: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
ae30: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
ae40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20  .    char *zBuf 
ae50: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
ae60: 61 63 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ace;        /* T
ae70: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
ae80: 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  one page */.    
ae90: 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20  if( !pPg->dirty 
aea0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
aeb0: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
aec0: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
aed0: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
aee0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
aef0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
af00: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
af10: 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e  e*(i64)(pPg->pgn
af20: 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  o-1));.      if(
af30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
af40: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
af50: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
af60: 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
af70: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
af80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
af90: 50 41 47 45 52 54 52 41 43 45 33 28 22 52 45 46  PAGERTRACE3("REF
afa0: 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
afb0: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
afc0: 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
afd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
afe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44  break;.      COD
aff0: 45 43 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66  EC1(pPager, zBuf
b000: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b  , pPg->pgno, 2);
b010: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b020: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
b030: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
b040: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
b050: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
b060: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  || memcmp(zBuf, 
b070: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
b080: 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
b090: 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d  Size) ){.      m
b0a0: 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
b0b0: 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20  ATA(pPg), zBuf, 
b0c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b0d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
b0e0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
b0f0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
b100: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c  ->xReiniter(pPg,
b110: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b120: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
b130: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
b140: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
b150: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
b160: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
b170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b180: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
b190: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
b1a0: 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
b1b0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
b1c0: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
b1d0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
b1e0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
b1f0: 64 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  dif.  }.  pPager
b200: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
b210: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
b220: 64 69 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  dif..static void
b230: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
b240: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
b250: 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ger);../*.** Tru
b260: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
b270: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
b280: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
b290: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
b2a0: 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f   indicated. Also
b2b0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
b2c0: 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  ched representat
b2d0: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ion of the file.
b2e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b2f0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
b300: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b310: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
b320: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b330: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b340: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
b350: 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
b360: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
b370: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
b380: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
b390: 69 36 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  i64)nPage);.  }.
b3a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b3b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
b3c0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
b3d0: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
b3e0: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
b3f0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
b400: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
b410: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
b420: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
b430: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
b440: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
b450: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
b460: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
b470: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
b480: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
b490: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
b4a0: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
b4b0: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
b4c0: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
b4d0: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
b4e0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
b4f0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
b500: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
b510: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b520: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
b530: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
b540: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
b550: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
b560: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
b570: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
b580: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
b590: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
b5a0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
b5b0: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
b5c0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
b5d0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b5e0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
b5f0: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
b600: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
b610: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
b620: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
b630: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
b640: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
b650: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
b660: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
b670: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
b680: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
b690: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b6a0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b6b0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
b6c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
b6d0: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
b6e0: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
b6f0: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
b700: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
b710: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
b720: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
b730: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
b740: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b750: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
b760: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
b770: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
b780: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
b790: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
b7a0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
b7b0: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
b7c0: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
b7d0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
b7e0: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
b7f0: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
b800: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
b810: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
b820: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
b830: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
b840: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
b850: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
b860: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
b870: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
b880: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
b890: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
b8a0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b8b0: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
b8c0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
b8d0: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
b8e0: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
b8f0: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
b900: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
b910: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
b920: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
b930: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
b940: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
b950: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
b960: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
b970: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
b980: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
b990: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
b9a0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b9b0: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
b9c0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
b9d0: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
b9e0: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
b9f0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
ba00: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
ba10: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
ba20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
ba30: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
ba40: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
ba50: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
ba60: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
ba70: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
ba80: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
ba90: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
baa0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bab0: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
bac0: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
bad0: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
bae0: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
baf0: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
bb00: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
bb10: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
bb20: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
bb30: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
bb40: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
bb50: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
bb60: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
bb70: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
bb80: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
bb90: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
bba0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
bbb0: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
bbc0: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
bbd0: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
bbe0: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
bbf0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
bc00: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
bc10: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
bc20: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
bc30: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
bc40: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
bc50: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
bc60: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
bc70: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
bc80: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
bc90: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
bca0: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
bcb0: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
bcc0: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
bcd0: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
bce0: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
bcf0: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
bd00: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
bd10: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
bd20: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
bd30: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
bd40: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
bd50: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
bd60: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
bd70: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
bd80: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
bd90: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
bda0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
bdb0: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
bdc0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
bdd0: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
bde0: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
bdf0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
be00: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
be10: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
be20: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
be30: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
be40: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
be50: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
be60: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
be70: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
be80: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
be90: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
bea0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
beb0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
bec0: 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
bed0: 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bef0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
bf00: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
bf10: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
bf20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bf30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
bf40: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
bf50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
bf60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bf80: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
bf90: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
bfa0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
bfb0: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
bfc0: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
bfd0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
bfe0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
bff0: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
c000: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
c010: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
c020: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
c030: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c040: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
c050: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
c060: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
c070: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
c080: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
c090: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
c0a0: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
c0b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c0c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
c0d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
c0e0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
c0f0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
c100: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c110: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
c120: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
c130: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
c140: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
c150: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
c160: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
c170: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
c180: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
c190: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c1a0: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
c1b0: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
c1c0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
c1d0: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
c1e0: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
c1f0: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
c200: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
c210: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
c220: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
c230: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
c240: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  l(pPager->jfd, &
c250: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
c260: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
c270: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
c280: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
c290: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
c2a0: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
c2b0: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
c2c0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
c2d0: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
c2e0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
c2f0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
c300: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c310: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
c320: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c  yback;.  }.  sql
c330: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
c340: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50  r->jfd, 0);.  pP
c350: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c360: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
c370: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
c380: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
c390: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
c3a0: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
c3b0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
c3c0: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
c3d0: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
c3e0: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
c3f0: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
c400: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
c410: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c420: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
c430: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
c440: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
c450: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
c460: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
c470: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
c480: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
c490: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
c4a0: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
c4b0: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
c4c0: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
c4d0: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
c4e0: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
c4f0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
c500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
c510: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
c520: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
c530: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
c540: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c550: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
c560: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
c570: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c580: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
c590: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
c5a0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
c5b0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
c5c0: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
c5d0: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
c5e0: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
c5f0: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
c600: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
c610: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
c620: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
c630: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
c640: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
c650: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
c660: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
c670: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
c680: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
c690: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
c6a0: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
c6b0: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
c6c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c6d0: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
c6e0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c6f0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c700: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
c710: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
c720: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
c730: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
c740: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
c750: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c760: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c770: 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
c780: 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
c790: 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
c7a0: 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
c7b0: 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
c7c0: 73 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ss. In this case
c7d0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
c7e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
c7f0: 6e 73 69 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a  nsists of.    **
c800: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69   journalled copi
c810: 65 73 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  es of pages that
c820: 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 61 64   need to be read
c830: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 63   back into the c
c840: 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
c850: 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
c860: 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20  !isHot ){.      
c870: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
c880: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c890: 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
c8a0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
c8b0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
c8c0: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
c8d0: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
c8e0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
c8f0: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
c900: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
c910: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
c920: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
c930: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c940: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
c950: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c960: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
c970: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
c980: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
c990: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c9a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c9b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
c9c0: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
c9d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
c9e0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
c9f0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
ca00: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
ca10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ca20: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
ca30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
ca40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
ca50: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
ca60: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
ca70: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
ca80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
ca90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
caa0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
cab0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
cac0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
cad0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
cae0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
caf0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
cb00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
cb10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cb20: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
cb30: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
cb40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cb50: 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
cb60: 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
cb70: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
cb80: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
cb90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
cba0: 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
cbb0: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
cbc0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
cbd0: 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
cbe0: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
cbf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
cc00: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
cc10: 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
cc20: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
cc30: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
cc40: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
cc50: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
cc60: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
cc70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cc80: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
cc90: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
cca0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ccb0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
ccc0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
ccd0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
cce0: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
ccf0: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
cd00: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
cd10: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
cd20: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
cd30: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
cd40: 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
cd50: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
cd60: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
cd70: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
cd80: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
cd90: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63  */.  pPager->sec
cda0: 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
cdb0: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
cdc0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 72 65 74  ager->fd);.  ret
cdd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cde0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74   Playback the st
cdf0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
ce00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
ce10: 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e  imilar to playin
ce20: 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  g back the trans
ce30: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
ce40: 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77  ut with.** a few
ce50: 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a   extra twists..*
ce60: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
ce70: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ce80: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
ce90: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61   file at the sta
cea0: 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  rt of.**        
ceb0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
cec0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
ced0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f  er->stmtSize, no
cee0: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
cef0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
cf00: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
cf10: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
cf20: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
cf30: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
cf40: 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a   journal, also.*
cf50: 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61  *         playba
cf60: 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20  ck all pages of 
cf70: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
cf80: 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e  journal beginnin
cf90: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20  g.**         at 
cfa0: 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73  offset pPager->s
cfb0: 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  tmtJSize..*/.sta
cfc0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74  tic int pager_st
cfd0: 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  mt_playback(Page
cfe0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
cff0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
d000: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
d010: 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e  f the full journ
d020: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f  al */.  i64 hdrO
d030: 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20  ff;.  int nRec; 
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d050: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
d060: 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rds */.  int i; 
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
d090: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  r */.  int rc;..
d0a0: 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
d0b0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e  journalOff;.#ifn
d0c0: 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a  def NDEBUG .  {.
d0d0: 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a      i64 os_szJ;.
d0e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d0f0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
d100: 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29  r->jfd, &os_szJ)
d110: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d120: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
d130: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
d140: 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a   szJ==os_szJ );.
d150: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
d160: 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
d170: 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73  e the offset jus
d180: 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  t after the end 
d190: 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  of the last jour
d1a0: 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72  nal.  ** page wr
d1b0: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65  itten before the
d1c0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
d1d0: 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73  eader for this s
d1e0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
d1f0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72  ansaction was wr
d200: 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e  itten, or the en
d210: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
d220: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
d230: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
d240: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
d250: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
d260: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
d270: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
d280: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
d290: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
d2a0: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
d2b0: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
d2c0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
d2d0: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
d2e0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
d2f0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
d300: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
d310: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
d320: 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
d330: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
d340: 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
d350: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
d360: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
d370: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
d380: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
d390: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d3a0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
d3b0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
d3c0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71  rnalOpen );.  sq
d3d0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
d3e0: 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
d3f0: 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
d400: 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
d410: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
d420: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
d430: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d440: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
d450: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d460: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
d470: 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
d480: 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
d490: 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
d4a0: 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
d4b0: 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
d4c0: 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
d4d0: 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
d4e0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
d4f0: 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
d500: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
d510: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
d520: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d530: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d540: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
d550: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
d560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
d570: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
d580: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d590: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d5a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
d5b0: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
d5c0: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
d5d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
d5e0: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
d5f0: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
d600: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
d610: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
d620: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
d630: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
d640: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
d650: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
d660: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
d670: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
d680: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d690: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
d6a0: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
d6b0: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
d6c0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
d6d0: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
d6e0: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
d6f0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
d700: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
d710: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
d720: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
d730: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
d740: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
d750: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
d760: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
d770: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
d780: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d790: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
d7a0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d7b0: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
d7c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d7d0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
d7e0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73  e;.  pPager->cks
d7f0: 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d  umInit = pPager-
d800: 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68  >stmtCksum;.  wh
d810: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
d820: 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66  rnalOff < hdrOff
d830: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
d840: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
d850: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
d860: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
d870: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d880: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d890: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d8a0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
d8b0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
d8c0: 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
d8d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d8e0: 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
d8f0: 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
d900: 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
d910: 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
d920: 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
d930: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
d940: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
d950: 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
d960: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d970: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d980: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d990: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d9a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
d9b0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
d9c0: 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
d9d0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
d9e0: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
d9f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
da00: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
da10: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
da20: 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
da30: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
da40: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
da50: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
da60: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
da70: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
da80: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
da90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
daa0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
dab0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
dac0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
dad0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
dae0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  back;.    }.  }.
daf0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
db00: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a  alOff = szJ;.  .
db10: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
db20: 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  k:.  if( rc==SQL
db30: 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50  ITE_OK) {.    pP
db40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
db50: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70   = szJ;.    /* p
db60: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
db70: 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  e(pPager); */.  
db80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
db90: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
dba0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
dbb0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
dbc0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
dbd0: 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
dbe0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
dbf0: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
dc00: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
dc10: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
dc20: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
dc30: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
dc40: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
dc50: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
dc60: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
dc70: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
dc80: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
dc90: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
dca0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
dcb0: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
dcc0: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
dcd0: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
dce0: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
dcf0: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
dd00: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
dd10: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
dd20: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
dd30: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
dd40: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
dd50: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
dd60: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
dd70: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
dd80: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
dd90: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
dda0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
ddb0: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
ddc0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
ddd0: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
dde0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
ddf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
de00: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
de10: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
de20: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
de30: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
de40: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
de50: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
de60: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
de70: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
de80: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
de90: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
dea0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
deb0: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
dec0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
ded0: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
dee0: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
def0: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
df00: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
df10: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
df20: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
df30: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
df40: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
df50: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
df60: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
df70: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
df80: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
df90: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
dfa0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
dfb0: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
dfc0: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
dfd0: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
dfe0: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
dff0: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
e000: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
e020: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
e030: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
e040: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
e050: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
e060: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
e070: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
e080: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
e090: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
e0a0: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
e0b0: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
e0c0: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
e0d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e0e0: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
e0f0: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
e100: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
e110: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
e120: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
e130: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
e140: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
e150: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
e160: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
e170: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
e180: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
e190: 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
e1a0: 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
e1b0: 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
e1c0: 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
e1d0: 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b  int full_fsync){
e1e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
e1f0: 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c  c =  level==1 ||
e200: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
e210: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
e220: 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33  lSync = level==3
e230: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
e240: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
e250: 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75  >full_fsync = fu
e260: 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20  ll_fsync;.  if( 
e270: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
e280: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
e290: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
e2a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
e2b0: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
e2c0: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
e2d0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
e2e0: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
e2f0: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
e300: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
e310: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
e320: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
e330: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
e340: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
e350: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
e360: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
e370: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
e380: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
e390: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
e3a0: 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  y file. .**.** W
e3b0: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
e3c0: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
e3d0: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
e3e0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
e3f0: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
e400: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
e410: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
e420: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
e430: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
e440: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
e450: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
e460: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
e470: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  c int sqlite3Pag
e480: 65 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c  erOpentemp(OsFil
e490: 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  e **pFd){.  int 
e4a0: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
e4b0: 63 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b  c;.  char zFile[
e4c0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
e4d0: 53 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53  SIZE];..#ifdef S
e4e0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
e4f0: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
e500: 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
e510: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
e520: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
e530: 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20  .#endif.  do{.  
e540: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
e550: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
e560: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
e570: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e580: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
e590: 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61  , pFd, 1);.    a
e5a0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e5b0: 45 5f 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a  E_OK || *pFd );.
e5c0: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
e5d0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
e5e0: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
e5f0: 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e  OMEM );.  return
e600: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
e610: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
e620: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
e630: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
e640: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
e650: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
e660: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
e670: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
e680: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
e690: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
e6a0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
e6b0: 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
e6c0: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
e6d0: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
e6e0: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
e6f0: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
e700: 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
e710: 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Unref()..**.** I
e720: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
e730: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
e740: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
e750: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
e760: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
e770: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
e780: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
e790: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
e7a0: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
e7b0: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
e7c0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
e7d0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
e7e0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
e7f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
e800: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
e810: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
e820: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
e830: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
e840: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
e850: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
e860: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
e870: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e880: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
e890: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
e8a0: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
e8b0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
e8c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e8d0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
e8e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
e8f0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
e900: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
e910: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
e920: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
e930: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
e940: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
e950: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
e960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
e970: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
e980: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
e990: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e9a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
e9b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
e9c0: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20  .  int nameLen; 
e9d0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20   /* Compiler is 
e9e0: 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61  wrong. This is a
e9f0: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
ea00: 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a  d before use */.
ea10: 20 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30    OsFile *fd = 0
ea20: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ea30: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
ea40: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
ea50: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
ea60: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
ea70: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
ea80: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
ea90: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
eaa0: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
eab0: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
eac0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
ead0: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
eae0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
eaf0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
eb00: 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ZE];.#ifdef SQLI
eb10: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
eb20: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
eb30: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
eb40: 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
eb50: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
eb60: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
eb70: 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
eb80: 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
eb90: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
eba0: 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
ebb0: 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
ebc0: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
ebd0: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
ebe0: 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
ebf0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
ec00: 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
ec10: 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
ec20: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
ec30: 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75  n be set. It wou
ec40: 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73  ld be nice to as
ec50: 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54  sert.  ** that T
ec60: 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
ec70: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75   is non-zero, bu
ec80: 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61  t alas this brea
ec90: 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20  ks test cases . 
eca0: 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69   ** written to i
ecb0: 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20  nvoke the pager 
ecc0: 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  directly..  */. 
ecd0: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
ece0: 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
ecf0: 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
ed00: 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69  t( pTsd );.#endi
ed10: 66 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20  f..  /* We used 
ed20: 74 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f  to test if mallo
ed30: 63 28 29 20 68 61 64 20 61 6c 72 65 61 64 79 20  c() had already 
ed40: 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72  failed before pr
ed50: 6f 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20  oceeding. .  ** 
ed60: 42 75 74 20 74 68 65 20 77 61 79 20 74 68 69 73  But the way this
ed70: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
ed80: 64 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e  d in SQLite mean
ed90: 73 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72  s that can never
eda0: 0a 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75  .  ** happen. Fu
edb0: 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68  rthermore, if th
edc0: 65 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  e malloc-failed 
edd0: 66 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79 20  flag is already 
ede0: 73 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65  set, .  ** eithe
edf0: 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
ee00: 6c 69 74 65 53 74 72 44 75 70 28 29 20 6f 72 20  liteStrDup() or 
ee10: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62  sqliteMalloc() b
ee20: 65 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66  elow will.  ** f
ee30: 61 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20  ail shortly and 
ee40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74  SQLITE_NOMEM ret
ee50: 75 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20  urned anyway..  
ee60: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
ee70: 30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  0;..  /* Open th
ee80: 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64  e pager file and
ee90: 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61   set zFullPathna
eea0: 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d  me to point at m
eeb0: 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20  alloc()ed .  ** 
eec0: 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  memory containin
eed0: 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66  g the complete f
eee0: 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e  ilename (i.e. in
eef0: 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65  cluding the dire
ef00: 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69  ctory)..  */.  i
ef10: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
ef20: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
ef30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef40: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
ef50: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
ef60: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
ef70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
ef80: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
ef90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
efa0: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
efb0: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
efc0: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46  f.    {.      zF
efd0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
efe0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
eff0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
f000: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50        if( zFullP
f010: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
f020: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f030: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
f040: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
f050: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
f060: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
f070: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
f080: 66 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  fd );.      }.  
f090: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
f0a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
f0b0: 65 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b  erOpentemp(&fd);
f0c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
f0d0: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70  mpFileName(zTemp
f0e0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
f0f0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
f100: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
f110: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
f120: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
f130: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f140: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74  TE_OK ){.      t
f150: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
f160: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
f170: 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20  ocate the Pager 
f180: 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61  structure. As pa
f190: 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61  rt of the same a
f1a0: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63  llocation, alloc
f1b0: 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66  ate.  ** space f
f1c0: 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  or the full path
f1d0: 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64  s of the file, d
f1e0: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75  irectory and jou
f1f0: 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65  rnal .  ** (Page
f200: 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67  r.zFilename, Pag
f210: 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e  er.zDirectory an
f220: 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
f230: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  )..  */.  if( zF
f240: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
f250: 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72     nameLen = str
f260: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
f270: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
f280: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
f290: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
f2a0: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
f2b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
f2c0: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
f2d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
f2e0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
f2f0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
f300: 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44  llocRaw(SQLITE_D
f310: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
f320: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
f330: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
f340: 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
f350: 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
f360: 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
f370: 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69  memory .  ** poi
f380: 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c  nted to by zFull
f390: 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74  Pathname, free t
f3a0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
f3b0: 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
f3c0: 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e   .  ** file. Sin
f3d0: 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
f3e0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
f3f0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
f400: 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
f410: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
f420: 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
f430: 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
f440: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c  zFullPathname ||
f450: 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
f460: 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ace || rc!=SQLIT
f470: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
f480: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
f490: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f4a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f4b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
f4c0: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
f4d0: 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f  rn ((rc==SQLITE_
f4e0: 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  OK)?SQLITE_NOMEM
f4f0: 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  :rc);.  }..  PAG
f500: 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25  ERTRACE3("OPEN %
f510: 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
f520: 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c  DLEID(fd), zFull
f530: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54  Pathname);.  IOT
f540: 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
f550: 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46  s\n", pPager, zF
f560: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20  ullPathname)).  
f570: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
f580: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67  e = (char*)&pPag
f590: 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  er[1];.  pPager-
f5a0: 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
f5b0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f5c0: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70  [nameLen+1];.  p
f5d0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
f5e0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
f5f0: 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ctory[nameLen+1]
f600: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
f610: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46  r->zFilename, zF
f620: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f630: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
f640: 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c  Directory, zFull
f650: 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f  Pathname);..  fo
f660: 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30  r(i=nameLen; i>0
f670: 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
f680: 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
f690: 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
f6a0: 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
f6b0: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
f6c0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
f6d0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75  r->zJournal, zFu
f6e0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
f6f0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
f700: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
f710: 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
f720: 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22  rnal[nameLen], "
f730: 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50  -journal");.  pP
f740: 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  ager->fd = fd;. 
f750: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   /* pPager->jour
f760: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  nalOpen = 0; */.
f770: 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
f780: 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
f790: 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
f7a0: 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
f7b0: 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26  k = noReadlock &
f7c0: 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  & readOnly;.  /*
f7d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
f7e0: 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
f7f0: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
f800: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f810: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
f820: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
f830: 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
f840: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f850: 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
f860: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
f870: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
f880: 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
f890: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
f8a0: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f8b0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
f8c0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f8d0: 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b  r->nMaxPage = 0;
f8e0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
f8f0: 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73  Page = 100;.  as
f900: 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f  sert( PAGER_UNLO
f910: 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50  CK==0 );.  /* pP
f920: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
f930: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
f940: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
f950: 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
f960: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
f970: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73   tempFile;.  ass
f980: 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
f990: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
f9a0: 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
f9b0: 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
f9c0: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
f9d0: 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
f9e0: 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
f9f0: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
fa00: 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
fa10: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
fa20: 64 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a  de = tempFile; .
fa30: 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
fa40: 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  = memDb;.  pPage
fa50: 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65  r->readOnly = re
fa60: 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
fa70: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
fa80: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
fa90: 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
faa0: 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73  >tempFile || !us
fab0: 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
fac0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
fad0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30  pPager->noSync?0
fae0: 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  :1);.  /* pPager
faf0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
fb00: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
fb10: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
fb20: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
fb30: 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
fb40: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
fb50: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
fb60: 28 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65  (nExtra);.  asse
fb70: 72 74 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20  rt(fd||memDb);. 
fb80: 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
fb90: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
fba0: 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
fbb0: 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b  sSectorSize(fd);
fbc0: 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
fbd0: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
fbe0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73   0; */.  /* mems
fbf0: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
fc00: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
fc10: 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
fc20: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
fc30: 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ger;.#ifdef SQLI
fc40: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
fc50: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50  _MANAGEMENT.  pP
fc60: 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ager->pNext = pT
fc70: 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54  sd->pPager;.  pT
fc80: 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
fc90: 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ger;.#endif.  re
fca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fcb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
fcc0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
fcd0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
fce0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
fcf0: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
fd00: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
fd10: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
fd20: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
fd30: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
fd40: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
fd50: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
fd60: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
fd70: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
fd80: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
fd90: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
fda0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
fdb0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
fdc0: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
fdd0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
fde0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
fdf0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
fe00: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
fe10: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
fe20: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
fe30: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
fe40: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
fe50: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
fe60: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
fe70: 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a  PagerClose().  .
fe80: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
fe90: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
fea0: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  y sqlite3PagerUn
feb0: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
fec0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
fed0: 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a  structor(Pager *
fee0: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
fef0: 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e  Desc)(DbPage*,in
ff00: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
ff10: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
ff20: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
ff30: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
ff40: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
ff50: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
ff60: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
ff70: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
ff80: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
ff90: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
ffa0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
ffb0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
ffc0: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
ffd0: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
ffe0: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
fff0: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
10000 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
10010 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
10020 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
10030 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
10040 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
10050 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
10060 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10070 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
10080 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
10090 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
100a0 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
100b0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
100c0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
100d0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
100e0 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75  page size.  Retu
100f0 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e  rn the new size.
10100 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74    If the suggest
10110 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a   new page.** siz
10120 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61  e is inappropria
10130 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
10140 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
10150 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a  e is selected.**
10160 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a   and returned..*
10170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
10180 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
10190 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
101a0 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73   pageSize){.  as
101b0 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d  sert( pageSize>=
101c0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
101d0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
101e0 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21  _SIZE );.  if( !
101f0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
10200 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
10210 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
10220 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
10230 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10240 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
10250 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
10260 61 63 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61  ace = sqlite3Rea
10270 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65  llocOrFree(pPage
10280 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61  r->pTmpSpace, pa
10290 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72  geSize);.  }.  r
102a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61  eturn pPager->pa
102b0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
102c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
102d0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
102e0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
102f0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
10300 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
10310 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
10320 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
10330 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
10340 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
10350 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
10360 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
10370 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
10380 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
10390 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
103a0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
103b0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
103c0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
103d0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
103e0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
103f0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
10400 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
10410 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
10420 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
10430 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
10440 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
10450 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
10460 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
10470 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
10480 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
10490 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
104a0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
104b0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
104c0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
104d0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
104e0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
104f0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
10500 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
10510 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
10520 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
10530 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
10540 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
10550 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10560 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
10570 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
10580 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
10590 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
105a0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
105b0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
105c0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
105d0 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
105e0 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
105f0 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
10600 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
10610 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
10620 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
10630 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
10640 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
10650 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
10660 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
10670 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
10680 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
10690 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
106a0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
106b0 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
106c0 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
106d0 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
106e0 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
106f0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
10700 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
10710 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
10720 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
10730 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
10740 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
10750 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
10760 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
10770 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
10780 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
10790 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
107a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
107b0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
107c0 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
107d0 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  {.    disable_si
107e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
107f0 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
10800 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
10810 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c  d, 0);.    enabl
10820 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10830 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54  rrors();.    IOT
10840 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
10850 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
10860 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
10870 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
10880 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
10890 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
108a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
108b0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
108c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
108d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
108e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
108f0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
10900 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10910 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
10920 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10930 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
10940 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
10950 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
10960 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
10970 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
10980 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
10990 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
109a0 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
109b0 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
109c0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
109d0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
109e0 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
109f0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
10a00 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
10a10 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
10a20 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
10a30 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
10a40 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
10a50 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
10a60 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
10a70 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
10a80 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  n;.  int rc;.  a
10a90 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
10aa0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
10ab0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
10ac0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
10ad0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
10ae0 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
10af0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
10b00 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
10b10 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
10b20 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10b30 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
10b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10b50 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
10b60 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
10b70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10b80 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
10b90 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
10ba0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
10bb0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
10bc0 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
10bd0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
10be0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
10bf0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
10c00 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
10c10 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
10c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10c30 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
10c40 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
10c50 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
10c60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
10c70 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
10c80 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
10c90 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  B./*.** Clear a 
10ca0 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
10cb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10cc0 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
10cd0 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
10ce0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
10cf0 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
10d00 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
10d10 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
10d20 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
10d30 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
10d40 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
10d50 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
10d60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
10d70 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
10d80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
10d90 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
10da0 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  *);../*.** Unlin
10db0 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
10dc0 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
10dd0 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
10de0 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
10df0 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
10e00 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
10e10 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
10e20 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
10e30 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
10e40 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
10e50 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75  erMovepage() rou
10e60 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61  tine can leave a
10e70 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
10e80 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76   pNextFree/pPrev
10e90 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69  Free list that i
10ea0 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20  s not a part of 
10eb0 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a  any hash-chain..
10ec0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
10ed0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50  nlinkHashChain(P
10ee0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
10ef0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
10f00 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
10f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
10f20 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
10f30 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
10f40 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
10f50 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  n;.  }.  if( pPg
10f60 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
10f70 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
10f80 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
10f90 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
10fa0 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
10fb0 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61  revHash ){.    a
10fc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
10fd0 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26  Hash[pPg->pgno &
10fe0 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
10ff0 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20  1)]!=pPg );.    
11000 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
11010 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
11020 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
11030 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
11040 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50   pPg->pgno & (pP
11050 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
11060 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
11070 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
11080 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  tHash;.  }.  if(
11090 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c   MEMDB ){.    cl
110a0 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
110b0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
110c0 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50  ager));.  }.  pP
110d0 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70  g->pgno = 0;.  p
110e0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
110f0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
11100 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   0;.}../*.** Unl
11110 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ink a page from 
11120 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74  the free list (t
11130 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
11140 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
11150 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20  =0).** and from 
11160 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69  its hash collisi
11170 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  on chain..*/.sta
11180 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50  tic void unlinkP
11190 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
111a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
111b0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
111c0 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70  .  /* Keep the p
111d0 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e  FirstSynced poin
111e0 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ter pointing at 
111f0 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72  the first synchr
11200 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20  onized page */. 
11210 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
11220 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
11230 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
11240 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11250 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26  .    while( p &&
11260 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
11270 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
11280 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ; }.    pPager->
11290 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
112a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
112b0 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  nk from the free
112c0 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50  list */.  if( pP
112d0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
112e0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
112f0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
11300 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
11310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
11320 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
11330 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
11340 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
11350 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11360 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
11370 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
11380 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
11390 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
113a0 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
113b0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
113c0 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d  ( pPager->pLast=
113d0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
113e0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
113f0 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a  >pPrevFree;.  }.
11400 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
11410 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11420 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  e = 0;..  /* Unl
11430 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e  ink from the pgn
11440 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  o hash table */.
11450 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
11460 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
11470 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
11480 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
11490 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
114a0 63 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62  che when a datab
114b0 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61  ase.** is trunca
114c0 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20  ted.  Drop from 
114d0 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61  the cache all pa
114e0 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
114f0 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e  s.** larger than
11500 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
11510 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
11520 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ced..**.** Refer
11530 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
11540 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
11550 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
11560 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c  d..**.** Actuall
11570 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  y, at the point 
11580 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11590 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64  called, it would
115a0 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   be.** an error 
115b0 74 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65  to have a refere
115c0 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20  nced page.  But 
115d0 72 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65  rather than dele
115e0 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  te.** that page 
115f0 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20  and guarantee a 
11600 73 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61  subsequent segfa
11610 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65  ult, it seems be
11620 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20  tter.** to zero 
11630 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74  it and hope that
11640 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61   we error out sa
11650 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nely..*/.static 
11660 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
11670 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
11680 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
11690 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20  r *pPg;.  PgHdr 
116a0 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62  **ppPg;.  int db
116b0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
116c0 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d  bSize;..  ppPg =
116d0 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a   &pPager->pAll;.
116e0 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20    while( (pPg = 
116f0 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20  *ppPg)!=0 ){.   
11700 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
11710 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
11720 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
11730 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
11740 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30   if( pPg->nRef>0
11750 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
11760 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
11770 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
11780 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
11790 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
117a0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
117b0 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d  e{.      *ppPg =
117c0 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
117d0 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
117e0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
117f0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
11800 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
11810 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
11820 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
11830 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
11840 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
11850 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
11860 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
11870 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
11880 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
11890 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
118a0 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  e.  Repeat until
118b0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
118c0 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
118d0 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
118e0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
118f0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
11900 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
11910 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
11920 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
11930 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
11940 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
11950 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
11960 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
11970 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
11980 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
11990 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
119a0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
119b0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
119c0 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
119d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
119e0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
119f0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
11a00 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
11a10 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
11a20 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
11a30 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
11a40 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
11a50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11a60 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
11a70 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
11a80 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
11a90 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73   unknown */.  as
11aa0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11ab0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11ac0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
11ad0 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29  ize<0 || MEMDB )
11ae0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
11af0 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
11b00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11b10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
11b20 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11b30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
11b40 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
11b50 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
11b60 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
11b70 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
11b80 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
11b90 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
11ba0 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
11bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11bc0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
11bd0 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
11be0 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
11bf0 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
11c00 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
11c10 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
11c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11c30 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
11c40 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
11c50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
11c60 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
11c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
11c80 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
11c90 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
11ca0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
11cb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11cc0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11cd0 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20  D || MEMDB );.  
11ce0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11cf0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
11d00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
11d10 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
11d20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11d30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
11d40 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
11d50 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
11d60 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
11d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11d80 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  OK;.  }.  if( ME
11d90 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
11da0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
11db0 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
11dc0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
11dd0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
11de0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11df0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
11e00 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
11e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11e30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
11e40 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11e50 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
11e60 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
11e70 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
11e80 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11e90 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
11ea0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
11eb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11ed0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
11ee0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
11ef0 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
11f00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11f10 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
11f20 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
11f30 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
11f40 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
11f50 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
11f60 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
11f70 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
11f80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11f90 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
11fa0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
11fb0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
11fc0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
11fd0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
11fe0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
11ff0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
12000 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
12010 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
12020 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
12030 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
12040 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12050 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
12060 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
12070 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
12080 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12090 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
120a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
120b0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
120c0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
120d0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
120e0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
120f0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
12100 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
12110 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
12120 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
12130 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
12140 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
12150 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
12160 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
12170 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
12180 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
12190 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
121a0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
121b0 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
121c0 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
121d0 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
121e0 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
121f0 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
12200 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
12210 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
12220 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
12230 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
12240 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
12250 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
12260 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
12270 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
12280 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
12290 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
122a0 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
122b0 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
122c0 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  t..  */.  Thread
122d0 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
122e0 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
122f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12300 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
12310 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41  pTsd && pTsd->nA
12320 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  lloc );.#endif..
12330 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
12340 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
12350 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
12360 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
12370 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12380 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
12390 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
123a0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
123b0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
123c0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
123d0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
123e0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
123f0 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
12400 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
12410 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
12420 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
12430 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12440 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
12450 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
12460 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
12470 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
12480 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
12490 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
124a0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
124b0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
124c0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
124d0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
124e0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
124f0 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
12500 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
12510 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
12520 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
12530 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
12540 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
12550 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
12560 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
12570 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
12580 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12590 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
125a0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
125b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
125c0 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64   ** }.  */..#ifd
125d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
125e0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
125f0 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  NT.  /* Remove t
12600 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68  he pager from th
12610 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
12620 20 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67   pagers starting
12630 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64   at .  ** Thread
12640 44 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d  Data.pPager if m
12650 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
12660 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a   is enabled..  *
12670 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  /.  if( pPager==
12680 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a  pTsd->pPager ){.
12690 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72      pTsd->pPager
126a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
126b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
126c0 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  ager *pTmp;.    
126d0 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d  for(pTmp = pTsd-
126e0 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70  >pPager; pTmp->p
126f0 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54  Next!=pPager; pT
12700 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b  mp=pTmp->pNext){
12710 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78  }.    pTmp->pNex
12720 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
12730 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
12740 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
12750 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  r->aHash);.  sql
12760 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
12770 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
12780 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
12790 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
127a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
127b0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
127c0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
127d0 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
127e0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
127f0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
12800 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
12810 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  rn p->pgno;.}../
12820 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65  *.** The page_re
12830 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63  f() function inc
12840 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65  rements the refe
12850 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
12860 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68  a page..** If th
12870 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
12880 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
12890 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e  ist (the referen
128a0 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
128b0 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65  ) then.** remove
128c0 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65   it from the fre
128d0 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elist..**.** For
128e0 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d   non-test system
128f0 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73  s, page_ref() is
12900 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61   a macro that ca
12910 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a  lls _page_ref().
12920 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65  ** online of the
12930 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
12940 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74   is zero.  For t
12950 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
12960 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20  e_ref().** is a 
12970 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f  real function so
12980 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74   that we can set
12990 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64   breakpoints and
129a0 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74   trace it..*/.st
129b0 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f  atic void _page_
129c0 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
129d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
129e0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
129f0 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
12a00 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
12a10 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e  ist.  Remove it.
12a20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d   */.    if( pPg=
12a30 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46  =pPg->pPager->pF
12a40 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
12a50 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
12a60 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12a70 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26       while( p &&
12a80 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
12a90 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
12aa0 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  ; }.      pPg->p
12ab0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12ac0 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ced = p;.    }. 
12ad0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
12ae0 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
12af0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
12b00 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
12b10 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
12b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12b30 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  >pPager->pFirst 
12b40 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12b60 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
12b70 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  {.      pPg->pNe
12b80 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
12b90 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
12ba0 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
12bb0 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
12bc0 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
12bd0 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a  PrevFree;.    }.
12be0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
12bf0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
12c00 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45  Pg->nRef++;.  RE
12c10 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69  FINFO(pPg);.}.#i
12c20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
12c30 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
12c40 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
12c50 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50  pPg){.    if( pP
12c60 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
12c70 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50      _page_ref(pP
12c80 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
12c90 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b       pPg->nRef++
12ca0 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28  ;.      REFINFO(
12cb0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
12cc0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
12cd0 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
12ce0 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
12cf0 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
12d00 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
12d10 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
12d20 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
12d30 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
12d40 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
12d50 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
12d60 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
12d70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
12d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
12d90 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
12da0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
12db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12dc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
12dd0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
12de0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12df0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
12e00 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
12e10 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
12e20 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
12e30 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
12e40 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
12e50 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
12e60 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
12e70 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
12e80 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
12e90 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
12ea0 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
12eb0 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
12ec0 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
12ed0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
12ee0 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
12ef0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
12f00 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
12f10 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
12f20 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
12f30 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
12f40 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
12f50 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
12f60 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
12f70 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
12f80 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
12f90 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
12fa0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
12fb0 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
12fc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
12fd0 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
12fe0 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
12ff0 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
13000 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
13010 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
13020 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
13030 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
13040 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
13050 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
13060 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
13070 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
13080 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
13090 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
130a0 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
130b0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
130c0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
130d0 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
130e0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
130f0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
13100 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
13110 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
13120 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
13130 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
13140 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
13150 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
13160 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13170 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
13180 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
13190 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
131a0 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
131b0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
131c0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
131d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
131e0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
131f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13200 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  ;..  /* Sync the
13210 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
13220 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61  modifying the ma
13230 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  in database.  **
13240 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65   (assuming there
13250 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e   is a journal an
13260 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  d it needs to be
13270 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20   synced.).  */. 
13280 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
13290 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28  dSync ){.    if(
132a0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
132b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  le ){.      asse
132c0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
132d0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
132e0 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
132f0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
13300 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
13310 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
13320 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
13330 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
13340 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
13350 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
13360 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
13370 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
13380 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
13390 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
133a0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
133b0 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
133c0 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
133d0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
133e0 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
133f0 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
13400 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
13410 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13420 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20     i64 jSz;.    
13430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13440 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
13450 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20  r->jfd, &jSz);. 
13460 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
13470 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
13480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13490 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
134a0 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d  ==jSz );.      }
134b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
134c0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
134d0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
134e0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
134f0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
13500 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
13510 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
13520 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
13530 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
13540 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
13550 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
13560 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
13570 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
13580 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
13590 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
135a0 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
135b0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
135c0 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a  back. .        *
135d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
135e0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
135f0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
13600 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
13610 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
13620 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
13630 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
13640 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
13650 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
13660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13670 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
13680 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13690 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
136a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
136b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
136c0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
136d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20  pPager->jfd,.   
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
13700 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
13710 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
13720 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c));.        if(
13730 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13740 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
13750 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
13760 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20  %d\n", pPager,. 
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13790 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
137a0 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29  urnalMagic), 4))
137b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
137c0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
137d0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
137e0 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
137f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13800 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
13810 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
13820 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13830 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
13840 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
13850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13860 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54    }.      PAGERT
13870 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
13880 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
13890 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
138a0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
138b0 4a 53 59 4e 43 20 25 64 5c 6e 22 2c 20 70 50 61  JSYNC %d\n", pPa
138c0 67 65 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d  ger)).      rc =
138d0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
138e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
138f0 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
13900 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
13910 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
13920 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13930 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
13940 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
13950 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
13960 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
13970 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
13980 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
13990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
139a0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
139b0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
139c0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
139d0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
139e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
139f0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
13a00 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
13a10 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
13a20 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
13a30 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
13a40 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
13a50 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
13a60 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
13a70 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
13a80 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
13a90 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
13aa0 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
13ab0 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
13ac0 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
13ad0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
13ae0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
13af0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
13b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13b10 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
13b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13b30 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
13b40 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
13b50 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
13b60 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
13b70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
13b80 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
13b90 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
13ba0 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69   by pDirty and i
13bb0 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a  n pgno order..**
13bc0 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78   Do not both fix
13bd0 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72  ing the pPrevDir
13be0 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  ty pointers..*/.
13bf0 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65  static PgHdr *me
13c00 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  rge_pagelist(PgH
13c10 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70  dr *pA, PgHdr *p
13c20 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75  B){.  PgHdr resu
13c30 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54  lt, *pTail;.  pT
13c40 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20  ail = &result;. 
13c50 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42   while( pA && pB
13c60 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
13c70 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b  pgno<pB->pgno ){
13c80 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
13c90 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20  irty = pA;.     
13ca0 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20   pTail = pA;.   
13cb0 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72     pA = pA->pDir
13cc0 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
13cd0 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
13ce0 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  ty = pB;.      p
13cf0 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20  Tail = pB;.     
13d00 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79   pB = pB->pDirty
13d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13d20 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pA ){.    pTai
13d30 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
13d40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29    }else if( pB )
13d50 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
13d60 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73  rty = pB;.  }els
13d70 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  e{.    pTail->pD
13d80 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
13d90 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44  return result.pD
13da0 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  irty;.}../*.** S
13db0 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ort the list of 
13dc0 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
13dd0 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f  ng order by pgno
13de0 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20  .  Pages are.** 
13df0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
13e00 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54  rty pointers.  T
13e10 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
13e20 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f  inters are.** co
13e30 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20  rrupted by this 
13e40 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  sort..*/.#define
13e50 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41   N_SORT_BUCKET_A
13e60 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20  LLOC 25.#define 
13e70 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20  N_SORT_BUCKET   
13e80 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51      25.#ifdef SQ
13e90 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
13ea0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
13eb0 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b  sort_bucket = 0;
13ec0 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54  .  #undef N_SORT
13ed0 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e  _BUCKET.  #defin
13ee0 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
13ef0 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61  \.   (sqlite3_pa
13f00 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
13f10 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t?sqlite3_pager_
13f20 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f  n_sort_bucket:N_
13f30 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
13f40 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  C).#endif.static
13f50 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67   PgHdr *sort_pag
13f60 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e  elist(PgHdr *pIn
13f70 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f  ){.  PgHdr *a[N_
13f80 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
13f90 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  C], *p;.  int i;
13fa0 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20  .  memset(a, 0, 
13fb0 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68  sizeof(a));.  wh
13fc0 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20  ile( pIn ){.    
13fd0 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e  p = pIn;.    pIn
13fe0 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
13ff0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
14000 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
14010 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b  N_SORT_BUCKET-1;
14020 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
14030 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
14040 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
14050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14070 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
14080 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
14090 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b         a[i] = 0;
140a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
140b0 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54     if( i==N_SORT
140c0 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20  _BUCKET-1 ){.   
140d0 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20     /* Coverage: 
140e0 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65  To get here, the
140f0 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e  re need to be 2^
14100 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20  (N_SORT_BUCKET) 
14110 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
14120 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ts in the input 
14130 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f  list. This is po
14140 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72  ssible, but impr
14150 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a  actical..      *
14160 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c  * Testing this l
14170 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74  ine is the point
14180 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   of global varia
14190 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  ble.      ** sql
141a0 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
141b0 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20  t_bucket..      
141c0 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  */.      a[i] = 
141d0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61  merge_pagelist(a
141e0 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  [i], p);.    }. 
141f0 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20   }.  p = a[0];. 
14200 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f   for(i=1; i<N_SO
14210 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b  RT_BUCKET; i++){
14220 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70  .    p = merge_p
14230 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29  agelist(p, a[i])
14240 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
14250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
14260 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
14270 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
14280 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
14290 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
142a0 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
142b0 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
142c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
142d0 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
142e0 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
142f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
14300 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
14310 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
14320 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
14330 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
14340 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14350 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14360 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
14370 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
14380 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
14390 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
143a0 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
143b0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
143c0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
143d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
143e0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
143f0 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
14400 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
14410 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
14420 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
14430 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
14440 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
14450 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
14460 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
14470 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
14480 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
14490 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
144a0 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
144b0 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
144c0 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
144d0 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
144e0 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
144f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14500 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
14510 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
14520 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
14530 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
14540 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
14550 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
14560 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
14570 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
14580 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
14590 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
145a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
145b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
145c0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
145d0 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
145e0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
145f0 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
14600 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
14610 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
14620 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
14630 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
14640 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
14650 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
14660 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
14670 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
14680 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
14690 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
146a0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
146b0 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
146c0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
146d0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
146e0 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
146f0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
14700 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
14710 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
14720 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
14730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14740 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
14750 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70    pList = sort_p
14760 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a  agelist(pList);.
14770 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
14780 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
14790 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  ist->dirty );.  
147a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
147b0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
147c0 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
147d0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
147e0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
147f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14800 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
14810 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
14820 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
14830 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
14840 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
14850 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
14860 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
14870 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
14880 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
14890 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
148a0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
148b0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
148c0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
148d0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
148e0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
148f0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
14900 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
14910 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
14920 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
14930 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
14940 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
14950 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
14960 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
14970 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
14980 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
14990 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
149a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
149b0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
149c0 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  no);.      IOTRA
149d0 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
149e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69  \n", pPager, pLi
149f0 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  st->pgno)).     
14a00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
14a10 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
14a20 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
14a30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14a40 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
14a50 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
14a60 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
14a70 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
14a80 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f   PAGERTRACE3("NO
14a90 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
14aa0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
14ab0 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
14ac0 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  o);.    }.#endif
14ad0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
14ae0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69  turn rc;.    pLi
14af0 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  st->dirty = 0;.#
14b00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
14b10 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69  CK_PAGES.    pLi
14b20 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  st->pageHash = p
14b30 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
14b40 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ist);.#endif.   
14b50 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
14b60 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
14b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14b80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
14b90 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
14ba0 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
14bb0 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
14bc0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
14bd0 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
14be0 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
14bf0 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
14c00 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
14c10 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
14c20 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
14c30 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
14c40 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
14c50 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
14c60 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69  turn pPager->pDi
14c70 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
14c80 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
14c90 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
14ca0 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
14cb0 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
14cc0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
14cd0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
14ce0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
14cf0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
14d00 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
14d10 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
14d20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
14d30 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
14d40 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
14d50 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
14d60 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
14d70 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
14d80 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
14d90 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
14da0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
14db0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
14dc0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
14dd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14de0 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  f( !pPager->useJ
14df0 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20  ournal ) return 
14e00 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
14e10 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
14e20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
14e30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14e40 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
14e50 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
14e60 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
14e70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14e80 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
14e90 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
14ea0 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  nt(pPager)==0 ){
14eb0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
14ec0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
14ed0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75  urnal);.    retu
14ee0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
14ef0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
14f00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
14f10 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
14f20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63  the cache that c
14f30 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20  an be recycled. 
14f40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14f50 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ine may return S
14f60 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
14f70 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49  ITE_FULL or SQLI
14f80 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f  TE_OK. It .** do
14f90 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70  es not set the p
14fa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76  Pager->errCode v
14fb0 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
14fc0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63  ic int pager_rec
14fd0 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  ycle(Pager *pPag
14fe0 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20  er, int syncOk, 
14ff0 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20  PgHdr **ppPg){. 
15000 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a   PgHdr *pPg;.  *
15010 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73  ppPg = 0;..  ass
15020 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a 0a 20 20  ert(!MEMDB);..  
15030 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
15040 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
15050 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
15060 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
15070 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
15080 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
15090 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
150a0 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61    */.  pPg = pPa
150b0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
150c0 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
150d0 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
150e0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
150f0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
15100 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
15110 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
15120 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
15130 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
15140 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
15150 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
15160 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
15170 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
15180 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
15190 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
151a0 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
151b0 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
151c0 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e  r->pFirst && syn
151d0 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
151e0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
151f0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
15200 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
15210 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15220 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
15230 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
15240 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  nc ){.      /* I
15250 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
15260 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
15270 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15280 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
15290 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
152a0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
152b0 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
152c0 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
152d0 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
152e0 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
152f0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
15300 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
15310 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
15320 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
15330 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15340 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
15350 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
15360 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
15370 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
15380 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
15390 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
153a0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
153b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
153c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
153d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
153e0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
153f0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  nc==0 );.      r
15400 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
15410 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
15420 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
15430 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15440 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
15450 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65  .    pPg = pPage
15460 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20  r->pFirst;.  }. 
15470 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
15480 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15490 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
154a0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
154b0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
154c0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
154d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
154e0 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
154f0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
15500 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
15510 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
15520 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
15530 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
15540 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
15550 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
15560 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
15570 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
15580 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
15590 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pg );.    if( rc
155a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
155b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
155c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
155d0 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
155e0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
155f0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
15600 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
15610 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
15620 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
15630 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
15640 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
15650 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
15660 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
15670 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
15680 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
15690 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
156a0 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
156b0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
156c0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
156d0 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
156e0 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
156f0 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
15700 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
15710 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
15720 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
15730 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
15740 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
15750 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
15760 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
15770 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
15780 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
15790 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
157a0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
157b0 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
157c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
157d0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
157e0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
157f0 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43  ("ALWAYS_ROLLBAC
15800 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
15810 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  ).    pPager->al
15820 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
15830 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
15840 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
15850 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
15860 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
15870 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
15880 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
15890 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
158a0 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67  o==0 );..  *ppPg
158b0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
158c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
158d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
158e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
158f0 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
15900 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
15910 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
15920 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
15930 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
15940 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
15950 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
15960 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
15970 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
15980 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46 72 65  may be sqliteFre
15990 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65  e()ed..**.** nRe
159a0 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  q is the number 
159b0 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
159c0 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63  ry required. Onc
159d0 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a  e this much has.
159e0 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ** been released
159f0 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
15a00 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69  eturns. A negati
15a10 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65  ve value for nRe
15a20 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20  q means.** free 
15a30 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
15a40 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20  s possible. The 
15a50 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
15a60 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
15a70 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
15a80 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
15a90 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
15aa0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
15ab0 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20  _MANAGEMENT.int 
15ac0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65  sqlite3PagerRele
15ad0 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  aseMemory(int nR
15ae0 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
15af0 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
15b00 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
15b10 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
15b20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
15b30 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
15b40 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c  /* If the the gl
15b50 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65  obal mutex is he
15b60 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  ld, this subrout
15b70 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20  ine becomes a.  
15b80 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79  ** o-op; zero by
15b90 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72  tes of memory ar
15ba0 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69  e freed.  This i
15bb0 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73  s because.  ** s
15bc0 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20  ome of the code 
15bd0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20  invoked by this 
15be0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73  function may als
15bf0 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62  o.  ** try to ob
15c00 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20  tain the mutex, 
15c10 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64  resulting in a d
15c20 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  eadlock..  */.  
15c30 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  if( sqlite3OsInM
15c40 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72  utex(0) ){.    r
15c50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
15c60 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f  /* Outermost loo
15c70 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f  p runs for at mo
15c80 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e  st two iteration
15c90 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69  s. First iterati
15ca0 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74  on we.  ** try t
15cb0 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68  o find memory th
15cc0 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  at can be releas
15cd0 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69  ed without calli
15ce0 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f  ng fsync(). Seco
15cf0 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f  nd.  ** iteratio
15d00 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75  n (which only ru
15d10 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ns if the first 
15d20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e  failed to free n
15d30 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a  Req bytes of.  *
15d40 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72  * memory) is per
15d50 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66  mitted to call f
15d60 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20  sync(). This is 
15d70 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d  of course much m
15d80 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73  ore .  ** expens
15d90 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
15da0 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b  i=0; i<=1; i++){
15db0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
15dc0 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51  rough all the SQ
15dd0 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e  Lite pagers open
15de0 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
15df0 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  t thread. */.   
15e00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
15e10 20 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b   pTsdro->pPager;
15e20 0a 20 20 20 20 66 6f 72 28 20 3b 20 70 50 61 67  .    for( ; pPag
15e30 65 72 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c  er && (nReq<0 ||
15e40 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
15e50 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d  ; pPager=pPager-
15e60 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50  >pNext){.      P
15e70 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
15e80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
15e90 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
15ea0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15eb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15ec0 20 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c   For each pager,
15ed0 20 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20   try to free as 
15ee0 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f  many pages as po
15ef0 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20  ssible (without 
15f00 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e  .      ** callin
15f10 67 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69  g fsync() if thi
15f20 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  s is the first i
15f30 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
15f40 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20  outermost .     
15f50 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20   ** loop)..     
15f60 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
15f70 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
15f80 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
15f90 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
15fa0 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20  ) && pPg) {.    
15fb0 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75      /* We've fou
15fc0 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65  nd a page to fre
15fd0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
15fe0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
15ff0 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  en .        ** r
16000 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
16010 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
16020 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
16030 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
16040 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79      ** (pFirstSy
16050 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69  nced). It is sti
16060 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61  ll in the all pa
16070 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e  ges (pAll) list.
16080 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d   .        ** Rem
16090 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73  ove it from this
160a0 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65   list before fre
160b0 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a  eing..        **
160c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f  .        ** Todo
160d0 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65  : Check the Page
160e0 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20  r.pStmt list to 
160f0 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69  make sure this i
16100 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20  s Ok. It .      
16110 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73    ** probably is
16120 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20   though..       
16130 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64   */.        PgHd
16140 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20  r *pTmp;.       
16150 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
16160 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d          if( pPg=
16170 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b  =pPager->pAll ){
16180 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67  .           pPag
16190 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e  er->pAll = pPg->
161a0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
161b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
161c0 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61     for( pTmp=pPa
161d0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d  ger->pAll; pTmp-
161e0 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20  >pNextAll!=pPg; 
161f0 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74  pTmp=pTmp->pNext
16200 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20  All ){}.        
16210 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c    pTmp->pNextAll
16220 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
16230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16240 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d      nReleased +=
16250 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65   sqliteAllocSize
16260 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73  (pPg);.        s
16270 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
16280 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
16290 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
162a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
162b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
162c0 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
162d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
162e0 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20  ile or .        
162f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61  ** journal in pa
16300 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54  ger_recycle(). T
16310 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  he error is not 
16320 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
16330 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  .        ** call
16340 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  er of this funct
16350 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65  ion. Instead, se
16360 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43  t the Pager.errC
16370 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  ode variable..  
16380 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72        ** The err
16390 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  or will be retur
163a0 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
163b0 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68  (or users, in th
163c0 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 20 20  e case .        
163d0 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70  ** of a shared p
163e0 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74  ager cache) of t
163f0 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69  he pager for whi
16400 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  ch the error occ
16410 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ured..        */
16420 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16430 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
16440 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d  TE_IOERR || rc==
16450 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20  SQLITE_FULL );. 
16460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16470 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
16480 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
16490 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
164a0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
164b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
164c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65   }..  return nRe
164d0 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  leased;.}.#endif
164e0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
164f0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
16500 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ENT */../*.** Re
16510 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
16520 66 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  f page pPg out o
16530 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16540 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
16550 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 61  nt readDbPage(Pa
16560 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
16570 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  dr *pPg, Pgno pg
16580 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
16590 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
165a0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
165b0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
165c0 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
165d0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
165e0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Size);.  if( rc=
165f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16610 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
16620 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16630 50 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Pg),.           
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16660 3b 0a 20 20 7d 0a 20 20 49 4f 54 52 41 43 45 28  ;.  }.  IOTRACE(
16670 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
16680 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a   pPager, pgno)).
16690 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 46    PAGERTRACE3("F
166a0 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
166b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
166c0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
166d0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
166e0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
166f0 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
16700 20 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   3);.  return rc
16710 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
16720 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
16730 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  led to obtain th
16740 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65  e shared lock re
16750 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a  quired before.**
16760 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61   data may be rea
16770 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
16780 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73   cache. If the s
16790 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61  hared lock has a
167a0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
167b0 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75  btained, this fu
167c0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
167d0 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  p..**.** Immedia
167e0 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
167f0 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ning the shared 
16800 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65  lock (if require
16810 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  d), this functio
16820 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20  n.** checks for 
16830 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
16840 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  le. If one is fo
16850 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63  und, an emergenc
16860 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  y rollback.** is
16870 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64   performed immed
16880 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
16890 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
168a0 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
168b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
168c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
168d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
168e0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
168f0 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
16900 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16910 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
16920 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
16930 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
16940 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
16950 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
16960 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
16970 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
16980 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16990 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
169a0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
169b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
169c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
169d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
169e0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
169f0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
16a00 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
16a10 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
16a20 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
16a30 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
16a40 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
16a50 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16a60 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
16a70 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
16a80 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
16a90 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
16aa0 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48  /.      if( hasH
16ab0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
16ac0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16ad0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
16ae0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16af0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
16b00 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
16b10 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72          ** impor
16b20 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
16b30 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
16b40 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
16b50 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
16b60 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
16b70 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
16b80 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
16b90 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
16ba0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
16bb0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
16bc0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
16bd0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
16be0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
16bf0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16c00 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
16c10 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
16c20 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
16c30 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20  ing it .        
16c40 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
16c50 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   ** .        ** 
16c60 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
16c70 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
16c80 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
16c90 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
16ca0 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
16cb0 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
16cc0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
16cd0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
16ce0 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  il to.        **
16cf0 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
16d00 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16d10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16d20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
16d30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16d40 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
16d50 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
16d60 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
16d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16d80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16d90 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
16da0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
16db0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16dc0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16de0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16df0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
16e00 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  E;. .        /* 
16e10 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
16e20 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
16e30 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
16e40 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
16e50 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
16e60 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
16e70 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
16e80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
16e90 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
16ea0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
16eb0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
16ec0 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
16ed0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
16ee0 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
16ef0 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
16f00 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
16f10 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a   holds.        *
16f20 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
16f30 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
16f40 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
16f50 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
16f60 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
16f70 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
16f80 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
16f90 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a   time..        *
16fa0 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  *..** Open the j
16fb0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
16fc0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
16fd0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
16fe0 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d   ..** exclusive-
16ff0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
17000 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17010 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
17020 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
17030 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
17040 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
17050 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
17060 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
17070 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
17080 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
17090 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
170a0 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
170b0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
170c0 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
170d0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
170e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
170f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17100 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  Y;.        if( s
17110 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
17120 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
17130 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
17140 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20    int ro;.      
17150 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
17160 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
17170 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17180 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
17190 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a  dWrite(pPager->z
171a0 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
171b0 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20  ->jfd, &ro);.   
171c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
171d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
171e0 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20  pPager->jfd );. 
171f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 20           if( ro 
17200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
17210 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17220 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17230 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
17240 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
17250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17260 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17280 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
17290 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
172a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
172b0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
172c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
172d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
172e0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
172f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
17300 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
17310 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
17320 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
17330 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
17340 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
17350 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17360 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
17370 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
17380 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
17390 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
173a0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
173b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
173c0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
173d0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
173e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
173f0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
17400 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
17410 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17430 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
17440 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
17450 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
17460 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
17470 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
17480 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
17490 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
174a0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
174b0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
174c0 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
174d0 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
174e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
174f0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
17500 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
17510 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
17520 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
17530 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
17540 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
17550 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
17560 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
17570 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
17580 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
17590 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
175a0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
175b0 6e 29 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65  n). If the value
175c0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
175d0 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 2a  ounter.        *
175e0 2a 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  * stored in Page
175f0 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 6d  r.iChangeCount m
17600 61 74 63 68 65 73 20 74 68 61 74 20 66 6f 75 6e  atches that foun
17610 64 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 0a 20  d on page 1 of. 
17620 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
17630 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
17640 6e 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68  n no database ch
17650 61 6e 67 65 73 20 68 61 76 65 20 6f 63 63 75 72  anges have occur
17660 65 64 20 73 69 6e 63 65 0a 20 20 20 20 20 20 20  ed since.       
17670 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 61   ** the cache wa
17680 73 20 6c 61 73 74 20 76 61 6c 69 64 20 61 6e 64  s last valid and
17690 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
176a0 65 74 61 69 6e 20 74 68 65 20 63 61 63 68 65 64  etain the cached
176b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
176c0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  s. Otherwise, if
176d0 20 50 61 67 65 72 2e 69 43 68 61 6e 67 65 43 6f   Pager.iChangeCo
176e0 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  unt does not mat
176f0 63 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ch the.        *
17700 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  * change-counter
17710 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68   on page 1 of th
17720 65 20 66 69 6c 65 2c 20 74 68 65 20 63 75 72 72  e file, the curr
17730 65 6e 74 20 63 61 63 68 65 20 63 6f 6e 74 65 6e  ent cache conten
17740 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 75  ts.        ** mu
17750 73 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  st be discarded.
17760 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17770 20 20 20 20 75 38 20 7a 43 5b 34 5d 3b 0a 20 20      u8 zC[4];.  
17780 20 20 20 20 20 20 75 33 32 20 69 43 68 61 6e 67        u32 iChang
17790 65 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  eCounter = 0;.  
177a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
177b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
177c0 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  er);..        if
177d0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
177e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
177f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
17800 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d  rCode;.        }
17810 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
17820 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
17830 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  {.          /* R
17840 65 61 64 20 74 68 65 20 34 2d 62 79 74 65 20 63  ead the 4-byte c
17850 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 64 69  hange counter di
17860 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
17870 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
17880 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17890 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
178a0 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 24);.         
178b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
178c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
178d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
178e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
178f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17900 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
17910 2c 20 7a 43 2c 20 34 29 3b 0a 20 20 20 20 20 20  , zC, 4);.      
17920 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17940 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17960 20 20 20 20 20 20 69 43 68 61 6e 67 65 43 6f 75        iChangeCou
17970 6e 74 65 72 20 3d 20 28 7a 43 5b 30 5d 3c 3c 32  nter = (zC[0]<<2
17980 34 29 20 2b 20 28 7a 43 5b 31 5d 3c 3c 31 36 29  4) + (zC[1]<<16)
17990 20 2b 20 28 7a 43 5b 32 5d 3c 3c 38 29 20 2b 20   + (zC[2]<<8) + 
179a0 7a 43 5b 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d  zC[3];.        }
179b0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ..        if( iC
179c0 68 61 6e 67 65 43 6f 75 6e 74 65 72 21 3d 70 50  hangeCounter!=pP
179d0 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75  ager->iChangeCou
179e0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
179f0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
17a00 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
17a10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17a20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17a30 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
17a40 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  | pPager->state<
17a50 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
17a60 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17a70 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
17a80 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
17a90 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
17aa0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
17ab0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
17ac0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
17ad0 6f 63 61 74 65 20 61 20 50 67 48 64 72 20 6f 62  ocate a PgHdr ob
17ae0 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72 20 63  ject.   Either c
17af0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
17b00 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65  or reuse.** an e
17b10 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74  xisting one that
17b20 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
17b30 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  e in use..**.** 
17b40 41 20 6e 65 77 20 50 67 48 64 72 20 73 74 72 75  A new PgHdr stru
17b50 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
17b60 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
17b70 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20  ollowing are.** 
17b80 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
17b90 28 31 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74  (1)  We have not
17ba0 20 65 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61   exceeded our ma
17bb0 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20  ximum allocated 
17bc0 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20  cache size.**   
17bd0 20 20 20 20 20 20 20 61 73 20 73 65 74 20 62 79         as set by
17be0 20 74 68 65 20 22 50 52 41 47 4d 41 20 63 61 63   the "PRAGMA cac
17bf0 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64  he_size" command
17c00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20  ..**.**     (2) 
17c10 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e   There are no un
17c20 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63  used PgHdr objec
17c30 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ts available at 
17c40 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  this time..**.**
17c50 20 20 20 20 20 28 33 29 20 20 54 68 69 73 20 69       (3)  This i
17c60 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
17c70 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
17c80 20 20 20 28 34 29 20 20 54 68 65 72 65 20 61 72     (4)  There ar
17c90 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63  e no PgHdr objec
17ca0 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72  ts that do not r
17cb0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
17cc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c  .**          fil
17cd0 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e  e sync and a syn
17ce0 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  c of the journal
17cf0 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
17d00 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70  ly.**          p
17d10 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  rohibited..**.**
17d20 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75 73   Otherwise, reus
17d30 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67  e an existing Pg
17d40 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Hdr.  In other w
17d50 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a  ords, reuse an.*
17d60 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  * existing PgHdr
17d70 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
17d80 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
17d90 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
17da0 20 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65    We have reache
17db0 64 20 6f 72 20 65 78 63 65 65 64 65 64 20 74 68  d or exceeded th
17dc0 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20  e maximum cache 
17dd0 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
17de0 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41   allowed by "PRA
17df0 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e  GMA cache_size".
17e00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  .**.**     (2)  
17e10 54 68 65 72 65 20 69 73 20 61 20 50 67 48 64 72  There is a PgHdr
17e20 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20   available with 
17e30 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a  PgHdr->nRef==0.*
17e40 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65  *.**     (3)  We
17e50 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69   are not in an i
17e60 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
17e70 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  e.**.**     (4) 
17e80 20 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73   Either there is
17e90 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67   an available Pg
17ea0 48 64 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  Hdr that does no
17eb0 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20  t need.**       
17ec0 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20     to be synced 
17ed0 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20  to disk or else 
17ee0 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20  disk syncing is 
17ef0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
17f00 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a        allowed..*
17f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17f20 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50  erAllocatePage(P
17f30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
17f40 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69  Hdr **ppPg){.  i
17f50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17f60 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  K;.  PgHdr *pPg;
17f70 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
17f80 6e 65 77 20 50 67 48 64 72 20 69 66 20 61 6e 79  new PgHdr if any
17f90 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e   of the four con
17fa0 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20  ditions defined 
17fb0 0a 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 6d  .  ** above is m
17fc0 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  et: */.  if( pPa
17fd0 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
17fe0 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20  r->mxPage.   || 
17ff0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
18000 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20  0 .   || MEMDB. 
18010 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 70 46    || (pPager->pF
18020 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26  irstSynced==0 &&
18030 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
18040 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  nc).  ){.    if(
18050 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d   pPager->nPage>=
18060 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b  pPager->nHash ){
18070 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
18080 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70  ize_hash_table(p
18090 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
180a0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35  pPager->nHash<25
180b0 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72  6 ? 256 : pPager
180c0 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20  ->nHash*2);.    
180d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48    if( pPager->nH
180e0 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ash==0 ){.      
180f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18100 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
18110 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
18120 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18130 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 73 71    }.    pPg = sq
18140 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
18150 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
18160 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
18190 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
181a0 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
181d0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
181e0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  );.    if( pPg==
181f0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
18200 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18210 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
18220 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
18230 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
18240 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
18250 67 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  g));.    if( MEM
18260 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  DB ){.      mems
18270 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  et(PGHDR_TO_HIST
18280 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
18290 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  , sizeof(PgHisto
182a0 72 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry));.    }.    
182b0 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
182c0 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
182d0 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
182e0 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67  ->pAll;.    pPag
182f0 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
18300 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
18310 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e++;.    if( pPa
18320 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65  ger->nPage>pPage
18330 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20  r->nMaxPage ){. 
18340 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
18350 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28  ger->nMaxPage==(
18360 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29  pPager->nPage-1)
18370 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
18380 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20  ->nMaxPage++;.  
18390 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
183a0 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65   /* Recycle an e
183b0 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74  xisting page wit
183c0 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75  h a zero ref-cou
183d0 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  nt. */.    rc = 
183e0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
183f0 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a  ager, 1, &pPg);.
18400 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
18420 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
18430 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
18440 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18450 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
18460 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
18470 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  rt(pPg);.  }.  *
18480 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67  ppPg = pPg;..pag
18490 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a  er_allocate_out:
184a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
184b0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
184c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
184d0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
184e0 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
184f0 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
18500 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
18510 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
18520 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
18530 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
18540 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
18550 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65  sed..**.** A _ge
18560 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  t works for any 
18570 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
18580 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
18590 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
185a0 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
185b0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
185c0 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
185d0 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
185e0 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
185f0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
18600 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
18610 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
18620 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
18630 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
18640 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
18650 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
18660 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
18670 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
18680 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
18690 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
186a0 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
186b0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
186c0 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
186d0 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
186e0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
186f0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
18700 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
18710 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
18720 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
18730 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
18740 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
18750 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
18760 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61   and _lookup() a
18770 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
18780 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
18790 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
187a0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
187b0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
187c0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
187d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
187e0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
187f0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
18800 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75   _lookup().** ju
18810 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
18820 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
18830 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
18840 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18850 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
18860 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
18870 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
18880 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
18890 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
188a0 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29   Since _lookup()
188b0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
188c0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
188d0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
188e0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
188f0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
18900 49 66 20 63 6c 72 46 6c 61 67 20 69 73 20 66 61  If clrFlag is fa
18910 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
18920 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
18930 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
18940 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66 46 6c 61  sk..** If clfFla
18950 67 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  g is true, it me
18960 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
18970 61 62 6f 75 74 20 74 6f 20 62 65 20 65 72 61 73  about to be eras
18980 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77 72 69 74  ed and.** rewrit
18990 74 65 6e 20 77 69 74 68 6f 75 74 20 66 69 72 73  ten without firs
189a0 74 20 62 65 69 6e 67 20 72 65 61 64 20 73 6f 20  t being read so 
189b0 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
189c0 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a 20 74 68  t it doing.** th
189d0 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69  e disk I/O..*/.i
189e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
189f0 63 71 75 69 72 65 28 50 61 67 65 72 20 2a 70 50  cquire(Pager *pP
18a00 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
18a10 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
18a20 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a  , int clrFlag){.
18a30 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
18a40 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
18a50 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18a60 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
18a70 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
18a80 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
18a90 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
18aa0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
18ab0 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
18ac0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
18ad0 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
18ae0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
18af0 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
18b00 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
18b10 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
18b20 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
18b30 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
18b40 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
18b50 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
18b60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18b70 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
18b80 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
18b90 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
18ba0 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
18bb0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
18bc0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
18bd0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
18be0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
18bf0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
18c00 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
18c10 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
18c20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18c30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
18c40 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
18c50 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
18c60 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
18c70 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
18c80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18c90 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
18ca0 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
18cb0 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
18cc0 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
18cd0 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
18ce0 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
18cf0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
18d00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d10 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
18d20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
18d30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18d40 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
18d50 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
18d60 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
18d70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
18d80 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
18d90 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
18da0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
18db0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
18dc0 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69   int nMax;.    i
18dd0 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49  nt h;.    TEST_I
18de0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
18df0 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  s);.    rc = pag
18e00 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  erAllocatePage(p
18e10 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20  Pager, &pPg);.  
18e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
18e40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
18e50 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
18e60 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
18e70 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e   !MEMDB || pgno>
18e80 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
18e90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
18ea0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
18eb0 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
18ec0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
18ed0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18ee0 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
18ef0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
18f00 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
18f10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
18f20 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
18f30 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
18f40 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
18f50 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
18f60 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
18f70 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
18f80 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
18f90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18fa0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
18fb0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
18fc0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
18fd0 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61   }..    makeClea
18fe0 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
18ff0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
19000 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
19010 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
19020 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
19030 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
19040 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
19050 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
19060 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
19070 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
19080 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c  }.    nMax = sql
19090 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
190a0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
190b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
190c0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
190d0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
190e0 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg);.      rc = 
190f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
19100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19110 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19120 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67  Populate the pag
19130 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74  e with data, eit
19140 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66  her by reading f
19150 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
19160 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72  .    ** file, or
19170 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
19180 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a  entire page to z
19190 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
191a0 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67  if( nMax<(int)pg
191b0 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28  no || MEMDB || (
191c0 63 6c 72 46 6c 61 67 20 26 26 20 21 70 50 61 67  clrFlag && !pPag
191d0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
191e0 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ck) ){.      mem
191f0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
19200 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
19210 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19230 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
19240 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
19250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19260 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
19270 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
19280 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
19290 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
192a0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
192b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
192c0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
192d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  rn rc;.      }el
192e0 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54  se{.        TEST
192f0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
19300 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ead);.      }.  
19310 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b    }..    /* Link
19320 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
19330 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62  he page hash tab
19340 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67  le */.    h = pg
19350 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
19360 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
19370 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
19380 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
19390 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
193a0 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
193b0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
193c0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
193d0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
193e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
193f0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
19400 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
19410 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
19420 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
19430 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
19440 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
19450 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
19460 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
19470 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
19480 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
19490 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
194a0 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
194b0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
194c0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
194d0 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d  >nRef>0 || pgno=
194e0 3d 31 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e  =1);.    TEST_IN
194f0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
19500 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  ;.    page_ref(p
19510 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
19520 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  ge = pPg;.  retu
19530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19540 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
19550 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
19560 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
19570 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
19580 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
19590 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
195a0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
195b0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
195c0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
195d0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
195e0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
195f0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
19600 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
19610 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
19620 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
19630 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
19640 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
19650 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
19660 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
19670 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
19680 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
19690 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
196a0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
196b0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
196c0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
196d0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
196e0 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
196f0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
19700 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
19710 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
19720 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
19730 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
19740 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
19750 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
19760 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
19770 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
19780 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19790 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
197a0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  NLOCK ){.    ass
197b0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41  ert( !pPager->pA
197c0 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78  ll || pPager->ex
197d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20  clusiveMode );. 
197e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
197f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
19800 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
19810 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
19820 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
19830 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50  turn 0;.  }.  pP
19840 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
19850 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
19860 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
19870 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
19880 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
19890 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
198a0 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
198b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
198c0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
198d0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
198e0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
198f0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
19900 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
19910 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
19920 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
19930 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
19940 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
19950 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
19960 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
19970 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
19980 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
19990 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
199a0 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
199b0 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
199c0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
199d0 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
199e0 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
199f0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
19a00 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
19a10 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
19a20 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
19a30 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
19a40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
19a50 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
19a60 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
19a70 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
19a80 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
19a90 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
19aa0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
19ab0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
19ac0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
19ad0 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  r;.    pPager = 
19ae0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
19af0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
19b00 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  = 0;.    pPg->pP
19b10 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72  revFree = pPager
19b20 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61  ->pLast;.    pPa
19b30 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
19b40 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
19b50 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
19b60 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
19b70 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
19b80 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
19b90 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
19ba0 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  st = pPg;.    }.
19bb0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
19bc0 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67  dSync==0 && pPag
19bd0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
19be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
19bf0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
19c00 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  d = pPg;.    }. 
19c10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
19c20 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
19c30 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
19c40 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61  tructor(pPg, pPa
19c50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19c60 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
19c70 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
19c80 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
19c90 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
19ca0 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
19cb0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
19cc0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
19cd0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
19ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19cf0 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
19d00 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
19d10 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67  Ref==0 && (!pPag
19d20 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
19d30 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
19d40 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
19d50 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
19d60 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
19d70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
19d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
19da0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
19db0 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
19dc0 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
19dd0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
19de0 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
19df0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19e00 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
19e10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19e20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
19e30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
19e40 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
19e50 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
19e60 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
19e70 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
19e80 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
19e90 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
19ea0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
19eb0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
19ec0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
19ed0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
19ee0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
19ef0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19f00 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19f20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
19f30 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
19f40 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
19f50 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
19f60 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
19f70 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
19f80 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19f90 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
19fa0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19fb0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
19fc0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
19fd0 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
19fe0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19ff0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
1a000 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a010 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1a020 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1a030 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1a040 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
1a050 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
1a060 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
1a070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46     pPager->tempF
1a0a0 69 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ile);.  assert( 
1a0b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a0c0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a   pPager->jfd );.
1a0d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a0e0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
1a0f0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
1a100 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
1a110 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69  rnalHdr = 0;.  i
1a120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a130 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
1a140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
1a150 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
1a160 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
1a170 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
1a180 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1a190 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1a1a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
1a1b0 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65  etFullSync(pPage
1a1c0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1a1d0 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73  full_fsync);.  s
1a1e0 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53  qlite3OsSetFullS
1a1f0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1a200 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
1a210 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
1a220 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
1a230 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1a240 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a  r->zDirectory);.
1a250 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a260 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
1a270 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1a280 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
1a290 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1a2a0 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
1a2b0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
1a2c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
1a2d0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
1a2e0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1a2f0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1a300 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
1a310 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1a320 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
1a330 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1a340 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1a350 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
1a360 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1a370 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1a380 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
1a390 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1a3a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a3b0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
1a3c0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
1a3d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a3e0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1a3f0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
1a400 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1a410 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
1a420 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1a430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1a450 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
1a460 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65  eturn rc;..faile
1a470 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1a480 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  l:.  sqliteFree(
1a490 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a4a0 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  al);.  pPager->a
1a4b0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
1a4c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a4d0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
1a4e0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
1a4f0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
1a500 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
1a510 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
1a520 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1a530 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
1a540 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1a550 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1a560 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
1a570 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1a580 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
1a590 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1a5a0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
1a5b0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1a5c0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1a5d0 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
1a5e0 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
1a5f0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
1a600 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1a610 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
1a620 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1a630 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
1a640 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
1a650 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1a660 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
1a670 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
1a680 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
1a690 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
1a6a0 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
1a6b0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1a6c0 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
1a6d0 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
1a6e0 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
1a6f0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
1a700 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1a710 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1a720 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
1a730 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
1a740 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
1a750 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
1a760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
1a770 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
1a780 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
1a790 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
1a7a0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
1a7b0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
1a7c0 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
1a7d0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1a7e0 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
1a7f0 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
1a800 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
1a810 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
1a820 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
1a830 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
1a840 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
1a850 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1a860 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
1a870 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1a880 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
1a890 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
1a8a0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1a8b0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
1a8c0 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
1a8d0 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
1a8e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1a8f0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
1a900 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
1a910 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
1a920 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
1a930 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
1a940 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
1a950 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
1a960 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
1a970 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
1a980 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1a990 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
1a9a0 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
1a9b0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a9c0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1a9d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1a9f0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
1aa00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1aa10 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1aa20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1aa30 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1aa40 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
1aa50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1aa60 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1aa70 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1aa80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1aa90 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
1aaa0 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
1aab0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1aac0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1aad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1aae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1aaf0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1ab00 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
1ab10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1ab20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ab30 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1ab40 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
1ab50 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
1ab60 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
1ab70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1ab80 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1ab90 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1aba0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
1abb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1abc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1abd0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1abe0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1abf0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1ac00 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
1ac10 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
1ac20 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
1ac30 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1ac40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
1ac50 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1ac60 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
1ac70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
1ac80 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
1ac90 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
1aca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1acb0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
1acc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1acd0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1ace0 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lOff==0 ){.    /
1acf0 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
1ad00 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61  hen the pager wa
1ad10 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  s in exclusive-a
1ad20 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a  ccess mode last.
1ad30 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72      ** time a (r
1ad40 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72  ead or write) tr
1ad50 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75  ansaction was su
1ad60 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c  ccessfully concl
1ad70 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  uded.    ** by t
1ad80 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  his connection. 
1ad90 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74  Instead of delet
1ada0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
1adb0 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20  file it was .   
1adc0 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   ** kept open an
1add0 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  d truncated to 0
1ade0 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   bytes..    */. 
1adf0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1ae00 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
1ae10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ae20 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
1ae30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ae40 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ae50 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  l==0 );.    sqli
1ae60 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1ae70 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
1ae80 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ae90 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
1aea0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1aeb0 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  /8 + 1 );.    if
1aec0 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ( !pPager->aInJo
1aed0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1aee0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1aef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1af00 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
1af10 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1af20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  dbSize;.      rc
1af30 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1af40 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1af50 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1af60 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1af70 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
1af80 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
1af90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1afa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1afb0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
1afc0 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69  ge dirty.  Set i
1afd0 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e  ts dirty flag an
1afe0 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  d add it to the 
1aff0 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69  dirty.** page li
1b000 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
1b010 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48  id makeDirty(PgH
1b020 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
1b030 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b  pPg->dirty==0 ){
1b040 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
1b050 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1b060 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
1b070 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
1b080 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
1b090 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20  pDirty;.    if( 
1b0a0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29  pPager->pDirty )
1b0b0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1b0c0 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
1b0d0 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ty = pPg;.    }.
1b0e0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
1b0f0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
1b100 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  ger->pDirty = pP
1b110 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1b120 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61  Make a page clea
1b130 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69  n.  Clear its di
1b140 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f  rty bit and remo
1b150 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a  ve it from the.*
1b160 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73  * dirty page lis
1b170 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1b180 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
1b190 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
1b1a0 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
1b1b0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
1b1c0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44  .    if( pPg->pD
1b1d0 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
1b1e0 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  g->pDirty->pPrev
1b1f0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72  Dirty = pPg->pPr
1b200 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  evDirty;.    }. 
1b210 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
1b220 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  vDirty ){.      
1b230 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d  pPg->pPrevDirty-
1b240 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1b250 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
1b260 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
1b270 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  ger->pDirty = pP
1b280 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
1b290 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  .  }.}.../*.** M
1b2a0 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
1b2b0 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
1b2c0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
1b2d0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
1b2e0 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
1b2f0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1b300 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
1b310 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
1b320 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
1b330 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
1b340 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1b350 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1b360 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1b370 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
1b380 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
1b390 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
1b3a0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
1b3b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b3c0 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
1b3d0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
1b3e0 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
1b3f0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1b400 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
1b410 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
1b420 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
1b430 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
1b440 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
1b450 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
1b460 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
1b470 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
1b480 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1b490 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1b4a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
1b4b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
1b4c0 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
1b4d0 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
1b4e0 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
1b4f0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1b500 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
1b510 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
1b520 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
1b530 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
1b540 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
1b550 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
1b560 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
1b570 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
1b580 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1b590 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72  PagerCommit() or
1b5a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1b5b0 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
1b5c0 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1b5d0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
1b5e0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
1b5f0 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44  id *pData = PGHD
1b600 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
1b610 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1b620 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1b630 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b640 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
1b650 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
1b660 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1b670 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72  rrCode ){ .    r
1b680 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1b690 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1b6a0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1b6b0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
1b6c0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
1b6d0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
1b6e0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1b6f0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
1b700 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
1b710 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
1b720 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
1b730 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1b740 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
1b750 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
1b760 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
1b770 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
1b780 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50  /.  makeDirty(pP
1b790 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  g);.  if( pPg->i
1b7a0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67  nJournal && (pag
1b7b0 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67  eInStatement(pPg
1b7c0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ) || pPager->stm
1b7d0 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
1b7e0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1b7f0 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
1b800 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
1b810 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
1b820 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1b830 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
1b840 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
1b850 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
1b860 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
1b870 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
1b880 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
1b890 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
1b8a0 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
1b8b0 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
1b8c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1b8d0 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
1b8e0 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
1b8f0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1b900 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b910 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1b920 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1b930 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b940 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67  e3PagerBegin(pPg
1b950 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1b960 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b970 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b980 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b990 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1b9a0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1b9b0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
1b9c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1b9d0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
1b9e0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1b9f0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
1ba00 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1ba10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ba20 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1ba30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
1ba40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1ba50 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
1ba60 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1ba70 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
1ba80 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1ba90 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
1baa0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1bab0 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
1bac0 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
1bad0 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
1bae0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1baf0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
1bb00 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
1bb10 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1bb20 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
1bb30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1bb40 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
1bb50 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1bb60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bb70 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1bb80 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
1bb90 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42  Journal || MEMDB
1bba0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
1bbb0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
1bbc0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1bbd0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1bbe0 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  nt szPg;.       
1bbf0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1bc00 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1bc10 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1bc20 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1bc30 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
1bc40 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f   PAGERTRACE3("JO
1bc50 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1bc60 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1bc70 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1bc80 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1bc90 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
1bca0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
1bcb0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
1bcc0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
1bcd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1bce0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
1bcf0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
1bd00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1bd10 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
1bd20 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
1bd30 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1bd40 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1bd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1bd60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1bd70 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64  u32 cksum, saved
1bd80 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
1bd90 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b   *pData2, *pEnd;
1bda0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
1bdb0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
1bdc0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
1bdd0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
1bde0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1bdf0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
1be00 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
1be10 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
1be20 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
1be30 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
1be40 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
1be50 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1be60 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
1be70 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1be80 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
1be90 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1bea0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1beb0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
1bec0 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
1bed0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
1bee0 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
1bef0 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 64 20  .          pEnd 
1bf00 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61 67 65  = pData2 + pPage
1bf10 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1bf20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d         pData2 -=
1bf30 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61   4;.          sa
1bf40 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e  ved = *(u32*)pEn
1bf50 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  d;.          put
1bf60 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73  32bits(pEnd, cks
1bf70 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  um);.          s
1bf80 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  zPg = pPager->pa
1bf90 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20  geSize+8;.      
1bfa0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44      put32bits(pD
1bfb0 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ata2, pPg->pgno)
1bfc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1bfd0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1bfe0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
1bff0 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20  ta2, szPg);.    
1c000 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1c010 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
1c020 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1c030 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
1c040 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1c050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c060 20 73 7a 50 67 29 29 0a 20 20 20 20 20 20 20 20   szPg)).        
1c070 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c080 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20  lOff += szPg;.  
1c090 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1c0a0 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE4("JOURNAL %d 
1c0b0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1c0c0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1c0d0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1c0e0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1c0f0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
1c100 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
1c110 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61  *(u32*)pEnd = sa
1c120 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65  ved;...  /* An e
1c130 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
1c140 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1c150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1c160 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
1c170 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
1c180 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1c190 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
1c1a0 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
1c1b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1c1c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1c1e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1c1f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50   }..          pP
1c200 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
1c210 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c220 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1c230 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
1c240 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1c250 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
1c260 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1c270 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
1c280 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1c290 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
1c2a0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
1c2b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1c2c0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
1c2d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1c2e0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1c2f0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1c300 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  7);.          }.
1c310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c320 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c330 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
1c340 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1c350 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
1c360 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
1c370 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1c380 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1c390 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1c3a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c3b0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c3c0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1c3d0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
1c3e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c3f0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1c400 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c410 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1c420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1c430 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1c440 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1c450 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
1c460 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
1c470 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
1c480 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
1c490 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
1c4a0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1c4b0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
1c4c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
1c4d0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
1c4e0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1c4f0 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
1c500 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
1c510 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
1c520 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
1c530 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
1c540 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
1c550 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
1c560 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1c570 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26  tmtInUse .     &
1c580 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
1c590 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26  nt(pPg) .     &&
1c5a0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1c5b0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1c5c0 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
1c5d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1c5e0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1c5f0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1c600 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1c610 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1c620 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1c630 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1c640 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1c650 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c660 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
1c670 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1c680 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1c690 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1c6a0 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
1c6b0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1c6c0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1c6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1c6e0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
1c6f0 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
1c700 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1c710 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c720 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
1c730 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1c740 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1c750 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c760 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1c770 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61  ;.        page_a
1c780 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1c790 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pPg);.      }els
1c7a0 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
1c7b0 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
1c7c0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1c7d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b  pPg->pgno, 7)-4;
1c7e0 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
1c7f0 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e  ts(pData2, pPg->
1c800 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  pgno);.        r
1c810 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c820 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
1c830 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1c840 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20  >pageSize+4);.  
1c850 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c860 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1c870 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1c880 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c890 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c8a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c8b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c8c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c8e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1c8f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
1c900 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1c910 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
1c920 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1c930 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1c940 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1c950 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  7);.      }.    
1c960 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1c970 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1c980 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1c990 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c9a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c9b0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1c9c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1c9d0 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
1c9e0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1c9f0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
1ca00 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
1ca10 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1ca20 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
1ca30 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
1ca40 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
1ca50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
1ca60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ca70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ca80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ca90 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61  s used to mark a
1caa0 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72   data-page as wr
1cab0 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20  itable. It uses 
1cac0 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28  .** pager_write(
1cad0 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72  ) to open a jour
1cae0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20  nal file (if it 
1caf0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1cb00 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74  pen).** and writ
1cb10 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74  e the page *pDat
1cb20 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  a to the journal
1cb30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
1cb40 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1cb50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
1cb60 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
1cb70 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
1cb80 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
1cb90 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
1cba0 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
1cbb0 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
1cbc0 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
1cbd0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
1cbe0 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
1cbf0 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
1cc00 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
1cc10 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1cc20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1cc30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1cc40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cc50 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
1cc60 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
1cc70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cc80 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
1cc90 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
1cca0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1ccb0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
1ccc0 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
1ccd0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
1cce0 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
1ccf0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
1cd00 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
1cd10 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
1cd20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
1cd30 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
1cd40 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1cd50 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1cd60 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
1cd70 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
1cd80 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1cd90 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1cda0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1cdb0 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
1cdc0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
1cdd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cde0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
1cdf0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
1ce00 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
1ce10 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74   ii;..    /* Set
1ce20 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1ce30 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1ce40 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1ce50 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1ce60 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1ce70 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1ce80 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1ce90 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1cea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1ceb0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1cec0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1ced0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
1cee0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1cef0 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
1cf00 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
1cf10 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
1cf20 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
1cf30 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
1cf40 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
1cf50 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
1cf60 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
1cf70 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
1cf80 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1cf90 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1cfa0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1cfb0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
1cfc0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
1cfd0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
1cfe0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
1cff0 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
1d000 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
1d010 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1d020 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
1d030 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
1d040 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1d050 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
1d060 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
1d070 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
1d080 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
1d090 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1d0a0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
1d0b0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
1d0c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
1d0d0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
1d0e0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
1d0f0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
1d100 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
1d110 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
1d120 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
1d130 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
1d140 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1d150 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
1d160 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
1d170 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
1d180 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69   pg1+ii;.      i
1d190 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
1d1a0 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50  ournal || pg==pP
1d1b0 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20  g->pgno || .    
1d1c0 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d        pg>pPager-
1d1d0 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21  >origDbSize || !
1d1e0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1d1f0 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70  nal[pg/8]&(1<<(p
1d200 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b  g&7))).      ) {
1d210 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
1d220 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1d230 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1d240 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
1d250 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d260 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1d270 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
1d280 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d290 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d2a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d2b0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1d2c0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
1d2d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1d2e0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1d2f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d300 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d310 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1d320 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1d330 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
1d340 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1d350 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1d360 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1d370 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
1d380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d390 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1d3a0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
1d3b0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1d3c0 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
1d3d0 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
1d3e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d3f0 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
1d400 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
1d410 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
1d420 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
1d430 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1d440 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
1d450 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1d460 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1d470 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
1d480 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
1d490 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  rty;.}.#endif..#
1d4a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d4b0 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
1d4c0 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
1d4d0 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
1d4e0 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
1d4f0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1d500 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
1d510 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1d520 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65  e3PagerOverwrite
1d530 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1d540 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
1d550 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
1d560 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
1d570 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1d580 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1d590 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20   pgno, &pPg);.  
1d5a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d5b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1d5c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d5d0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1d5e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d5f0 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69       memcpy(sqli
1d600 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
1d610 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61  pPg), pData, pPa
1d620 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1d630 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d640 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1d650 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d660 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1d670 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1d680 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1d690 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1d6a0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1d6b0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
1d6c0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
1d6d0 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61  n page "pgno" ba
1d6e0 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
1d6f0 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
1d700 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
1d710 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
1d720 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
1d730 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
1d740 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
1d750 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
1d760 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
1d770 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1d780 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
1d790 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
1d7a0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1d7b0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
1d7c0 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
1d7d0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
1d7e0 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
1d7f0 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
1d800 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
1d810 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
1d820 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1d830 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
1d840 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
1d850 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
1d860 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
1d870 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
1d880 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
1d890 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
1d8a0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1d8b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1d8c0 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
1d8d0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
1d8e0 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
1d8f0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
1d900 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d910 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
1d920 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
1d930 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
1d940 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
1d950 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1d960 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
1d970 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
1d980 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
1d990 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1d9a0 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
1d9b0 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
1d9c0 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
1d9d0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
1d9e0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
1d9f0 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
1da00 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
1da10 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
1da20 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1da30 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
1da40 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
1da50 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1da60 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
1da70 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
1da80 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
1da90 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
1daa0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  ntRollback() rou
1dab0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1dac0 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
1dad0 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
1dae0 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  s critical data,
1daf0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1db00 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
1db10 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  s.** rolled back
1db20 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65   in spite of the
1db30 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1db40 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  tRollback() call
1db50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1db60 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1db70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1db80 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1db90 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
1dba0 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
1dbb0 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
1dbc0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1dbd0 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
1dbe0 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20  Pg!=0 );  /* We 
1dbf0 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74  never call _dont
1dc00 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68  _write unless th
1dc10 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d  e page is in mem
1dc20 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79   */.  pPg->alway
1dc30 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1dc40 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1dc50 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1dc60 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1dc70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1dc80 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1dc90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1dca0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1dcb0 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1dcc0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1dcd0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1dce0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1dcf0 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1dd00 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1dd10 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1dd20 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1dd30 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1dd40 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1dd50 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1dd60 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1dd70 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1dd80 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1dd90 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1dda0 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1ddb0 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1ddc0 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1ddd0 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1dde0 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1ddf0 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1de00 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1de10 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1de20 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1de30 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1de40 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1de50 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1de60 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1de70 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1de80 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1de90 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1dea0 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1deb0 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1dec0 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1ded0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1dee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1def0 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
1df00 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1df10 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41   %d\n", pgno, PA
1df20 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1df30 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1df40 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
1df50 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20  pPager, pgno)). 
1df60 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
1df70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
1df80 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1df90 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
1dfa0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1dfb0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1dfc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1dfd0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1dfe0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1dff0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1e000 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1e010 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1e020 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1e030 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1e040 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1e050 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1e060 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1e070 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1e080 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1e090 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1e0a0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1e0b0 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
1e0c0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e0d0 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50  lback(DbPage *pP
1e0e0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1e0f0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1e100 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  r;..  assert( pP
1e110 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1e120 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1e130 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1e140 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
1e150 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
1e160 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1e170 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
1e180 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
1e190 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1e1a0 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1e1b0 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1e1c0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1e1d0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1e1e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e1f0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1e200 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1e210 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1e220 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1e230 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1e240 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1e250 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
1e260 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1e270 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1e280 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1e290 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1e2a0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20  pgno&7);.    }. 
1e2b0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1e2c0 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
1e2d0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1e2e0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1e2f0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1e300 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
1e310 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
1e320 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1e330 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1e340 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20  r->stmtInUse .  
1e350 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
1e360 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26  ment(pPg) .   &&
1e370 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1e380 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1e390 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  e .  ){.    asse
1e3a0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1e3b0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1e3c0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1e3d0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
1e3e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1e3f0 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1e400 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1e410 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1e420 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1e430 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1e440 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1e450 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
1e460 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
1e470 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
1e480 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
1e490 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
1e4a0 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
1e4b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e4c0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1e4d0 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
1e4e0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
1e4f0 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
1e500 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
1e510 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  nt rc;..  if( !p
1e520 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1e530 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a  ntDone ){.    /*
1e540 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1e550 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1e560 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
1e570 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1e580 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
1e590 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
1e5a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e5b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
1e5c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e5d0 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
1e5e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e5f0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1e600 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  .  .    /* Read 
1e610 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
1e620 65 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f  e at byte 24. */
1e630 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
1e640 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32  ter = retrieve32
1e650 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29  bits(pPgHdr, 24)
1e660 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72  ;.  .    /* Incr
1e670 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1e680 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1e690 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1e6a0 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63  yte 24. */.    c
1e6b0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
1e6c0 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28  .    put32bits((
1e6d0 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f  (char*)PGHDR_TO_
1e6e0 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34  DATA(pPgHdr))+24
1e6f0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1e700 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 69  );.    pPager->i
1e710 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 63 68  ChangeCount = ch
1e720 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
1e730 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
1e740 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
1e750 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
1e760 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1e770 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Hdr);.    pPager
1e780 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1e790 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
1e7a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e7b0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1e7c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1e7d0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
1e7e0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1e7f0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1e800 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1e810 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1e820 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1e830 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1e840 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1e850 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1e860 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1e870 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1e880 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1e890 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1e8a0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1e8b0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1e8c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1e8d0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1e8e0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1e8f0 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1e900 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1e910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e920 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1e930 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1e940 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1e950 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1e960 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1e970 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1e980 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1e990 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1e9a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1e9b0 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1e9c0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1e9d0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1e9e0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1e9f0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1ea00 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1ea10 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1ea20 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1ea30 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
1ea40 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1ea50 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
1ea60 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
1ea70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
1ea80 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
1ea90 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
1eaa0 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
1eab0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1eac0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1ead0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1eae0 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67  eOne(Pager *pPag
1eaf0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
1eb00 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
1eb10 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
1eb20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1eb30 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54  PAGERTRACE4("DAT
1eb40 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
1eb50 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
1eb60 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
1eb70 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
1eb80 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
1eb90 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49  nTrunc);..  /* I
1eba0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
1ebb0 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
1ebc0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
1ebd0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
1ebe0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1ebf0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1ec00 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
1ec10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1ec20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ec30 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
1ec40 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
1ec50 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1ec60 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1ec70 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
1ec80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ec90 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
1eca0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1ecb0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
1ecc0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1ecd0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
1ece0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1ecf0 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
1ed00 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
1ed10 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
1ed20 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
1ed30 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
1ed40 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
1ed50 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
1ed60 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
1ed70 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1ed80 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
1ed90 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
1eda0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
1edb0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
1edc0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
1edd0 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
1ede0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1edf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ee00 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1ee10 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
1ee20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
1ee30 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
1ee40 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1ee50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1ee60 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69  to sync_exit;.#i
1ee70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ee80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1ee90 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1eea0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
1eeb0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1eec0 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
1eed0 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
1eee0 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
1eef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  .        ** bein
1ef00 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
1ef10 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
1ef20 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
1ef30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1ef40 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
1ef50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ef60 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
1ef70 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
1ef80 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1ef90 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
1efa0 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
1efb0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1efc0 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
1efd0 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
1efe0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
1eff0 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
1f000 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
1f010 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1f020 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1f030 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
1f040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1f050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f060 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1f070 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
1f080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f090 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
1f0a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1f0b0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f0d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f0e0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f0f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f100 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
1f110 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1f120 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
1f130 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
1f140 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
1f150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f160 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f170 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1f180 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1f190 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f1a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1f1b0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1f1c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f1d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f1e0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1f1f0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1f200 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1f210 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1f220 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
1f230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f240 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f250 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1f260 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
1f270 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
1f280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f290 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
1f2a0 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1f2b0 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
1f2c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1f2d0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
1f2e0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1f2f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1f300 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1f310 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
1f320 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63   0;..    /* Sync
1f330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f340 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
1f350 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1f360 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1f370 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1f380 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
1f390 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
1f3a0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
1f3b0 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
1f3c0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1f3d0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65  _SYNCED;.  }else
1f3e0 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54   if( MEMDB && nT
1f3f0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  runc!=0 ){.    r
1f400 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f410 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
1f420 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73   nTrunc);.  }..s
1f430 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  ync_exit:.  retu
1f440 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1f450 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
1f460 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1f470 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
1f480 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
1f490 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
1f4a0 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
1f4b0 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
1f4c0 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
1f4d0 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
1f4e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1f4f0 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
1f500 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
1f510 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1f520 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1f530 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f540 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
1f550 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f560 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
1f570 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1f580 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1f590 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1f5a0 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1f5b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
1f5c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1f5d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1f5e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1f5f0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f   PAGERTRACE2("CO
1f600 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1f610 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1f620 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1f630 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1f640 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1f650 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
1f660 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
1f670 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1f680 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1f690 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1f6a0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1f6b0 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
1f6c0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1f6d0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1f6e0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1f6f0 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
1f700 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1f710 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1f720 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
1f730 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
1f740 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1f750 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
1f760 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
1f770 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
1f780 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   0;.#ifndef NDEB
1f790 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
1f7a0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
1f7b0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
1f7c0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
1f7d0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1f7e0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1f7f0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1f800 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
1f810 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
1f820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1f830 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
1f840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1f850 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
1f860 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1f870 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1f880 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1f890 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1f8a0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1f8b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1f8c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f8d0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1f8e0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
1f8f0 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  che );.  assert(
1f900 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1f910 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
1f920 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
1f930 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
1f940 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1f950 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ion(pPager);.  r
1f960 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1f970 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1f980 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1f990 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
1f9a0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
1f9b0 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
1f9c0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
1f9d0 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
1f9e0 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
1f9f0 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
1fa00 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
1fa10 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
1fa20 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
1fa30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fa40 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
1fa50 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
1fa60 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
1fa70 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
1fa80 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
1fa90 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73  otocol or unless
1faa0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
1fab0 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
1fac0 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
1fad0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
1fae0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
1faf0 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
1fb00 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
1fb10 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
1fb20 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
1fb30 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
1fb40 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
1fb50 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
1fb60 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
1fb70 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1fb80 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1fb90 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
1fba0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
1fbb0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1fbc0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
1fbd0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
1fbe0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1fbf0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1fc00 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1fc10 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
1fc20 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
1fc30 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1fc40 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1fc50 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1fc60 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
1fc70 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
1fc80 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
1fc90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1fca0 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1fcb0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1fcc0 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
1fcd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fce0 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1fcf0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1fd00 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
1fd10 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
1fd20 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
1fd30 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
1fd40 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1fd50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1fd60 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1fd70 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1fd80 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1fd90 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
1fda0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fdb0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1fdc0 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
1fdd0 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %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 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fe10 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1fe20 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
1fe30 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
1fe40 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1fe50 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
1fe60 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
1fe70 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
1fe80 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1fe90 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
1fea0 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
1feb0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1fec0 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
1fed0 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
1fee0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1fef0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
1ff00 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
1ff10 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1ff20 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d  niter(p, pPager-
1ff30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1ff40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
1ff50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
1ff60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
1ff70 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
1ff80 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1ff90 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1ffa0 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
1ffb0 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
1ffc0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1ffd0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
1ffe0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1fff0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
20000 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20010 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
20020 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
20030 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
20040 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
20050 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
20060 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
20070 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
20080 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
20090 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
200a0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
200b0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
200c0 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
200d0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
200e0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
200f0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
20100 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
20110 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
20120 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
20130 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
20140 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
20150 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
20160 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72    int rc2;.    r
20170 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
20180 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
20190 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
201a0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
201b0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
201c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
201d0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
201e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
201f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
20200 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
20210 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67  0);.  }.  /* pag
20220 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
20230 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
20240 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f  bSize = -1;..  /
20250 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20260 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
20270 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
20280 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
20290 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61  he pager.  ** ca
202a0 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
202b0 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
202c0 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
202d0 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a  e any error .  *
202e0 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
202f0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  */.  return page
20300 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
20310 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc);.}../*.** Re
20320 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
20330 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20340 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
20350 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
20360 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
20370 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
20380 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
20390 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
203a0 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
203b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
203c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
203d0 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
203e0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
203f0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
20400 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
20410 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20420 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
20430 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
20440 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b  rn pPager->nRef;
20450 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
20460 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69  E_TEST./*.** Thi
20470 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
20480 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
20490 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
204a0 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
204b0 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72  PagerStats(Pager
204c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
204d0 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
204e0 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
204f0 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
20500 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
20510 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
20520 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
20530 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
20540 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
20550 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
20560 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20570 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
20580 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
20590 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
205a0 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
205b0 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
205c0 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
205d0 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
205e0 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
205f0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
20600 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
20610 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  dif../*.** Set t
20620 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
20630 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
20640 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20650 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
20660 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
20670 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
20680 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
20690 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
206a0 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
206b0 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
206c0 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
206d0 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
206e0 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
206f0 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
20700 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
20710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20720 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
20730 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20740 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
20750 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
20760 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
20770 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20780 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
20790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
207a0 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
207b0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
207c0 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
207d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
207e0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
207f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
20800 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
20810 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
20820 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
20830 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
20840 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
20850 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
20860 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
20870 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
20880 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
20890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
208a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
208b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
208c0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
208d0 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  nStmt = sqliteMa
208e0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
208f0 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
20900 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
20910 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  tmt==0 ){.    /*
20920 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
20930 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
20940 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20  D_LOCK); */.    
20950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20960 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  MEM;.  }.#ifndef
20970 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73   NDEBUG.  rc = s
20980 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
20990 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
209a0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
209b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
209c0 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
209d0 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  iled;.  assert( 
209e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
209f0 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e == pPager->jou
20a00 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69  rnalOff );.#endi
20a10 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f.  pPager->stmt
20a20 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
20a30 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
20a40 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
20a50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20a60 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
20a70 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
20a80 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
20a90 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
20aa0 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
20ab0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
20ac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20ad0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 70 50  agerOpentemp(&pP
20ae0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
20af0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
20b00 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
20b10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
20b20 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
20b30 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
20b40 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
20b50 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
20b60 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
20b70 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
20b80 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
20b90 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
20ba0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
20bb0 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
20bc0 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
20bd0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
20be0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
20c00 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
20c10 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20c20 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72  StmtCommit(Pager
20c30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
20c40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
20c50 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
20c60 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
20c70 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
20c80 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
20c90 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20ca0 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
20cb0 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
20cc0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
20cd0 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
20ce0 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72    /* sqlite3OsTr
20cf0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
20d00 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  tfd, 0); */.    
20d10 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
20d20 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
20d30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
20d40 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
20d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
20d60 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
20d70 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
20d80 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  xt){.        PgH
20d90 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
20da0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
20db0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
20dc0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73      pNext = pHis
20dd0 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  t->pNextStmt;.  
20de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
20df0 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  ist->inStmt );. 
20e00 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e         pHist->in
20e10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
20e20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74    pHist->pPrevSt
20e30 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  mt = pHist->pNex
20e40 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
20e50 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
20e60 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
20e70 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
20e80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
20e90 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
20ea0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
20eb0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
20ec0 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
20ed0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
20ee0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
20ef0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
20f00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20f10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
20f20 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
20f30 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
20f40 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62  e3PagerStmtRollb
20f50 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
20f60 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
20f70 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
20f80 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47  InUse ){.    PAG
20f90 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52  ERTRACE2("STMT-R
20fa0 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
20fb0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
20fc0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
20fd0 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
20fe0 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74  Pg;.      PgHist
20ff0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
21000 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
21010 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
21020 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  g=pHist->pNextSt
21030 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69  mt){.        pHi
21040 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
21050 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
21060 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
21070 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
21080 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
21090 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
210a0 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  , pHist->pStmt, 
210b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
210c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
210d0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
210e0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
210f0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
21100 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
21110 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
21120 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
21130 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20  er->stmtSize;.  
21140 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
21150 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
21160 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
21170 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
21180 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
21190 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
211a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
211b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
211c0 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67  rStmtCommit(pPag
211d0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
211e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
211f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
21200 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
21210 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
21220 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21230 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
21240 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21250 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
21260 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
21270 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
21280 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21290 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
212a0 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
212b0 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
212c0 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
212d0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
212e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
212f0 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
21300 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21310 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
21320 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
21330 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
21340 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
21350 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21360 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
21370 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
21380 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
21390 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
213a0 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
213b0 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
213c0 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
213d0 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
213e0 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
213f0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
21400 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
21410 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
21420 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
21430 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
21440 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
21450 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21460 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
21470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
21480 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
21490 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
214a0 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
214b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
214c0 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
214d0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
214e0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
214f0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
21500 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
21510 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
21520 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
21530 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
21540 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
21550 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
21560 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21570 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
21580 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
21590 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
215a0 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f  pData to locatio
215b0 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
215c0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  le. .**.** There
215d0 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
215e0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75  rences to the cu
215f0 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e  rrent page pgno.
21600 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65   If current page
21610 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20  .** pgno is not 
21620 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
21630 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
21640 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74   it is not writt
21650 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62  en there by.** b
21660 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
21670 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73  The same applies
21680 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61   to the page pDa
21690 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20  ta refers to on 
216a0 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73  entry to.** this
216b0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
216c0 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
216d0 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74  e page refered t
216e0 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69  o by pData remai
216f0 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
21700 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
21710 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
21720 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69  th page pData (i
21730 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
21740 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
21750 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
21760 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
21770 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
21780 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
21790 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
217a0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
217b0 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
217c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
217d0 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
217e0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
217f0 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
21800 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
21810 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
21820 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
21830 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
21840 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
21850 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
21860 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
21870 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
21880 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
21890 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74   active)..*/.int
218a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
218b0 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  epage(Pager *pPa
218c0 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67  ger, DbPage *pPg
218d0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
218e0 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a  PgHdr *pPgOld; .
218f0 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
21900 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
21910 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
21920 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50  ->nRef>0 );..  P
21930 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45  AGERTRACE5("MOVE
21940 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
21950 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
21960 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
21970 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21980 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
21990 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f  ->needSync, pgno
219a0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
219b0 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
219c0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
219d0 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66  no, pgno))..  if
219e0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
219f0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
21a00 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
21a10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
21a20 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
21a30 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
21a40 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
21a50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
21a60 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
21a70 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
21a80 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
21a90 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
21aa0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
21ab0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
21ac0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
21ad0 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
21ae0 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
21af0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
21b00 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
21b10 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
21b20 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
21b30 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
21b40 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
21b50 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
21b60 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
21b70 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
21b80 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
21b90 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
21ba0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
21bb0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
21bc0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
21bd0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
21be0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
21bf0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
21c00 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
21c10 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
21c20 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
21c30 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28  pPgOld);.    if(
21c40 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
21c50 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
21c60 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
21c70 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
21c80 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
21c90 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
21ca0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
21cb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21cc0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
21cd0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
21ce0 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
21cf0 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
21d00 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
21d10 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
21d20 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
21d30 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67  pgno!=0 );.  pPg
21d40 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
21d50 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61   h = pgno & (pPa
21d60 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
21d70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
21d80 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73  sh[h] ){.    ass
21d90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
21da0 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
21db0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
21dc0 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
21dd0 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
21de0 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
21df0 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
21e00 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d  sh[h];.  pPager-
21e10 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
21e20 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  .  pPg->pPrevHas
21e30 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69  h = 0;..  makeDi
21e40 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
21e50 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
21e60 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
21e70 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
21e80 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
21e90 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
21ea0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
21eb0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
21ec0 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
21ed0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
21ee0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
21ef0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
21f00 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
21f10 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
21f20 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
21f30 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
21f40 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
21f50 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61   .    ** Pager.a
21f60 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61  InJournal bit ha
21f70 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
21f80 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
21f90 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67  edied by loading
21fa0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
21fb0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
21fc0 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
21fd0 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
21fe0 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a  Sync flag..    *
21ff0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
22000 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63  ite3PagerGet() c
22010 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68  all may cause th
22020 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e  e journal to syn
22030 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  c. So make.    *
22040 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72  * sure the Pager
22050 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
22060 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a  s set too..    *
22070 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  /.    int rc;.  
22080 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
22090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
220a0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
220b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
220c0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
220d0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
220e0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
220f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22100 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22110 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
22120 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
22130 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
22140 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a  .    pPgHdr->inJ
22150 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
22160 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  makeDirty(pPgHdr
22170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
22180 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
22190 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
221a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
221b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
221c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
221d0 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
221e0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
221f0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
22200 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
22210 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
22220 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  urn PGHDR_TO_DAT
22230 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  A(pPg);.}../*.**
22240 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22250 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e  r to the Pager.n
22260 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22  Extra bytes of "
22270 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a  extra" space .**
22280 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
22290 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
222a0 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
222b0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
222c0 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a  etExtra(DbPage *
222d0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
222e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
222f0 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ger;.  return (p
22300 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45  Pager?PGHDR_TO_E
22310 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
22320 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ):0);.}../*.** G
22330 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69  et/set the locki
22340 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  ng-mode for this
22350 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
22360 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
22370 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f  one.** of PAGER_
22380 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
22390 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  Y, PAGER_LOCKING
223a0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a  MODE_NORMAL or .
223b0 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
223c0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20  MODE_EXCLUSIVE. 
223d0 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
223e0 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
223f0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  then.** the lock
22400 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  ing-mode is set 
22410 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
22420 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
22430 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
22440 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
22450 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
22460 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  MAL or.** PAGER_
22470 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
22480 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e  USIVE, indicatin
22490 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  g the current (p
224a0 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
224b0 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  .** locking-mode
224c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
224d0 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
224e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
224f0 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
22500 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
22510 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
22520 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
22530 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
22540 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
22550 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  MAL.            
22560 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
22570 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
22580 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
22590 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
225a0 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
225b0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
225c0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
225d0 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c  AL>=0 && PAGER_L
225e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
225f0 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28  SIVE>=0 );.  if(
22600 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50   eMode>=0 && !pP
22610 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
22620 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  {.    pPager->ex
22630 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d  clusiveMode = eM
22640 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
22650 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
22660 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
22670 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
22680 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
22690 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
226a0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
226b0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
226c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f  e of the file lo
226d0 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ck for the given
226e0 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72   pager..** The r
226f0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f  eturn value is o
22700 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53  ne of NO_LOCK, S
22710 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
22720 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45  RVED_LOCK,.** PE
22730 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45  NDING_LOCK, or E
22740 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
22750 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22760 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65  erLockstate(Page
22770 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
22780 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f  turn sqlite3OsLo
22790 63 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e  ckState(pPager->
227a0 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  fd);.}.#endif..#
227b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
227c0 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UG./*.** Print a
227d0 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20   listing of all 
227e0 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  referenced pages
227f0 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63   and their ref c
22800 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
22810 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d  lite3PagerRefdum
22820 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
22830 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
22840 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
22850 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
22860 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
22870 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
22880 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
22890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
228a0 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25  ugPrintf("PAGE %
228b0 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  3d addr=%p nRef=
228c0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70  %d\n", .       p
228d0 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f  Pg->pgno, PGHDR_
228e0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
228f0 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a  g->nRef);.  }.}.
22900 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f  #endif..#endif /
22910 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
22920 53 4b 49 4f 20 2a 2f 0a                          SKIO */.