/ Hex Artifact Content
Login

Artifact 62c0f6b4c4856a760d4a7430c88492a7b626ac18:


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 32 34  : pager.c,v 1.24
0350: 32 20 32 30 30 36 2f 30 31 2f 31 38 20 31 35 3a  2 2006/01/18 15:
0360: 32 35 3a 31 37 20 64 61 6e 69 65 6c 6b 31 39 37  25: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 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20   TRACE1(X)      
0450: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0460: 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 54  ntf(X).#define T
0470: 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20 73  RACE2(X,Y)     s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54  f(X,Y).#define T
04a0: 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73  RACE3(X,Y,Z)   s
04b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
04c0: 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  f(X,Y,Z).#define
04d0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65  ntf(X,Y,Z,W).#de
0500: 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c  fine TRACE5(X,Y,
0510: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0540: 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64 65  ne TRACE1(X).#de
0550: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0560: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
0570: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54  X,Y,Z).#define T
0580: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23  RACE4(X,Y,Z,W).#
0590: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
05a0: 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66 0a  Y,Z,W,V).#endif.
05b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
05c0: 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20  wing two macros 
05d0: 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20  are used within 
05e0: 74 68 65 20 54 52 41 43 45 58 28 29 20 6d 61 63  the TRACEX() mac
05f0: 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ros above.** to 
0600: 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64  print out file-d
0610: 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a  escriptors. .**.
0620: 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61 6b  ** PAGERID() tak
0630: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
0640: 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20 61  a Pager struct a
0650: 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e  s it's argument.
0660: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0670: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0680: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0690: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
06a0: 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a  akes an OsFile.*
06b0: 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73  * struct as it's
06c0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64   argument..*/.#d
06d0: 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29  efine PAGERID(p)
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 26 28   FILEHANDLEID(&(
06f0: 70 29 2d 3e 66 64 29 0a 23 64 65 66 69 6e 65 20  p)->fd).#define 
0700: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0710: 20 28 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 48   (sqlite3OsFileH
0720: 61 6e 64 6c 65 28 26 66 64 29 29 0a 0a 2f 2a 0a  andle(&fd))../*.
0730: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0740: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0750: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
0760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0770: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
0780: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
0790: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07a0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07b0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
07c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
07d0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
07e0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
07f0: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0800: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0810: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0820: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0830: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0840: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0860: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
0870: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
0880: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0890: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
08d0: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
08e0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0910: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0920: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0940: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0950: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
0960: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
0970: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
0980: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
0990: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09a0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
09c0: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
09d0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
09e0: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
09f0: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a20: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a30: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a40: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0a70: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0a80: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0ab0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0ac0: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0ad0: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0ae0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0af0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b00: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b10: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b20: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b30: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0b60: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0b70: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0b80: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0ba0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bb0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0bc0: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0bf0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c00: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c10: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c20: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c30: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c40: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0c60: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0c70: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0c80: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cb0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0cc0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0cd0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0cf0: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d00: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d10: 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0d40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0d50: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0d80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0d90: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0da0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0db0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0dc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
0dd0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
0de0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0df0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0e00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0e10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0e20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0e30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0e40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0e50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0e70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0e80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0e90: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0ea0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0eb0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ec0: 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  ons to.** PAGER_
0ed0: 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65  RESERVED.  (Note
0ee0: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0ef0: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0f00: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0f10: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0f20: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0f30: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0f40: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0f50: 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66  PAGER_SHARED bef
0f60: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0f70: 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45  ns to PAGER_RESE
0f80: 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72  RVED.).** The tr
0f90: 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45  ansition to PAGE
0fa0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75  R_EXCLUSIVE occu
0fb0: 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61  rs when before a
0fc0: 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ny changes.** ar
0fd0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
0fe0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66  tabase file.  Af
0ff0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61  ter an sqlite3pa
1000: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a  ger_rollback().*
1010: 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65  * or sqlite_page
1020: 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20  r_commit(), the 
1030: 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20  state goes back 
1040: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
1050: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
1060: 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a  R_UNLOCK      0.
1070: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48  #define PAGER_SH
1080: 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a  ARED      1   /*
1090: 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f   same as SHARED_
10a0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
10b0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20  PAGER_RESERVED  
10c0: 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    2   /* same as
10d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a   RESERVED_LOCK *
10e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
10f0: 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20  EXCLUSIVE   4   
1100: 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55  /* same as EXCLU
1110: 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  SIVE_LOCK */.#de
1120: 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45  fine PAGER_SYNCE
1130: 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20  D      5../*.** 
1140: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  If the SQLITE_BU
1150: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1160: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f   macro is set to
1170: 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65   true at compile
1180: 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66  -time,.** then f
1190: 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74  ailed attempts t
11a0: 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64  o get a reserved
11b0: 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b   lock will invok
11c0: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
11d0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ack..** This is 
11e0: 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20  off by default. 
11f0: 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e   To see why, con
1200: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1210: 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a  ing scenario:.**
1220: 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72   .** Suppose thr
1230: 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61  ead A already ha
1240: 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
1250: 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65  and wants a rese
1260: 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68  rved lock..** Th
1270: 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68  read B already h
1280: 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  as a reserved lo
1290: 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20  ck and wants an 
12a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
12b0: 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65   If.** both thre
12c0: 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68  ads are using th
12d0: 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63  eir busy callbac
12e0: 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ks, it might be 
12f0: 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62  a long time.** b
1300: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
1310: 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70   threads give up
1320: 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20   and allows the 
1330: 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64  other to proceed
1340: 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
1350: 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f  thread trying to
1360: 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65   get the reserve
1370: 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20  d lock gives up 
1380: 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69  quickly.** (if i
1390: 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20  t never invokes 
13a0: 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63  its busy callbac
13b0: 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  k) then the cont
13c0: 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a  ention will be.*
13d0: 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b  * resolved quick
13e0: 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ly..*/.#ifndef S
13f0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1400: 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  VED_LOCK.# defin
1410: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
1420: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65  SERVED_LOCK 0.#e
1430: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1440: 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61   macro rounds va
1450: 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20  lues up so that 
1460: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1470: 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a  an address it.**
1480: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1490: 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20  o be an address 
14a0: 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20  that is aligned 
14b0: 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  to an 8-byte bou
14c0: 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ndary..*/.#defin
14d0: 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  e FORCE_ALIGNMEN
14e0: 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26  T(X)   (((X)+7)&
14f0: 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ~7)../*.** Each 
1500: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  in-memory image 
1510: 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73  of a page begins
1520: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
1530: 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54  ing header..** T
1540: 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e  his header is on
1550: 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68  ly visible to th
1560: 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e  is pager module.
1570: 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20    The client.** 
1580: 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20  code that calls 
1590: 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20  pager sees only 
15a0: 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  the data that fo
15b0: 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72  llows the header
15c0: 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63  ..**.** Client c
15d0: 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  ode should call 
15e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
15f0: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1600: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1610: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1620: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1630: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1640: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  e sqlite3pager_w
1650: 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c  rite().** is cal
1660: 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  led, the origina
1670: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
1680: 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1690: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a   the rollback.**
16a0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48   journal and PgH
16b0: 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64  dr.inJournal and
16c0: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
16d0: 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c  are set.  Later,
16e0: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75   once.** the jou
16f0: 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61  rnal page has ma
1700: 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64  de it onto the d
1710: 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48  isk surface, PgH
1720: 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69  dr.needSync.** i
1730: 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20  s cleared.  The 
1740: 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61  modified page ca
1750: 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20  nnot be written 
1760: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72  back into the or
1770: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1780: 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  se file until th
1790: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20  e journal pages 
17a0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
17b0: 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a  to disk and the.
17c0: 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  ** PgHdr.needSyn
17d0: 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  c has been clear
17e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67  ed..**.** The Pg
17f0: 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69  Hdr.dirty flag i
1800: 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74  s set when sqlit
1810: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1820: 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a  is called and.**
1830: 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69   is cleared agai
1840: 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  n when the page 
1850: 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74  content is writt
1860: 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f  en back to the o
1870: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
1880: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70  ase file..*/.typ
1890: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
18a0: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
18b0: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
18c0: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
18f0: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
1900: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1930: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
1940: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
1950: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
1960: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
1970: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
1980: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
1990: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19a0: 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72  xtFree, *pPrevFr
19b0: 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74  ee;  /* Freelist
19c0: 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20   of pages where 
19d0: 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  nRef==0 */.  PgH
19e0: 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20  dr *pNextAll;   
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a00: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
1a10: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
1a20: 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76  NextStmt, *pPrev
1a30: 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f  Stmt;  /* List o
1a40: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
1a50: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1a60: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1a70: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1a80: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1a90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1aa0: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1ab0: 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20   u8 inStmt;     
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68  /* TRUE if in th
1ae0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
1af0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
1b00: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b20: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
1b30: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
1b40: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
1b50: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
1b70: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
1b80: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
1b90: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
1ba0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
1bb0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
1bc0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1bd0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1be0: 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65  .  short int nRe
1bf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1c00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1c10: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
1c20: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  e */.  PgHdr *pD
1c30: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1c40: 20 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70        /* Dirty p
1c50: 61 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50  ages sorted by P
1c60: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66  gHdr.pgno */.#if
1c70: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1c80: 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67  _PAGES.  u32 pag
1c90: 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20  eHash;.#endif.  
1ca0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /* pPager->pageS
1cb0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67  ize bytes of pag
1cc0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
1cd0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1ce0: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1cf0: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1d00: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1d10: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1d20: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1d30: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1d40: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1d50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1d60: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1d70: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
1d80: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
1d90: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1da0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
1db0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
1dc0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1dd0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1de0: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1df0: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1e00: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1e10: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1e20: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e30: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1e40: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e50: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1e60: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1e70: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
1e80: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
1e90: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
1ea0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
1eb0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
1ec0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
1ed0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1ee0: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1ef0: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1f00: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1f10: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1f20: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1f30: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1f40: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1f50: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1f60: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1f70: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
1f80: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
1f90: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
1fa0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
1fb0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
1fc0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
1fd0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
1fe0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
1ff0: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
2000: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2010: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2020: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
2030: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
2040: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
2050: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
2060: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
2070: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
2080: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
2090: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  DEC(P,D,N,X) if(
20a0: 20 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d   P->xCodec ){ P-
20b0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
20c0: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
20d0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f  else.# define CO
20e0: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e  DEC(P,D,N,X).#en
20f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2100: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2110: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2120: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2130: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2140: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2150: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2160: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2170: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2180: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
2190: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
21a0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
21b0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
21c0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
21d0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
21e0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
21f0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2200: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2210: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2220: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2230: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2240: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2250: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2260: 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65   How big to make
2270: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2280: 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e  used for locatin
2290: 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  g in-memory page
22a0: 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d  s.** by page num
22b0: 62 65 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  ber. This macro 
22c0: 6c 6f 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73  looks a little s
22d0: 69 6c 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61  illy, but is eva
22e0: 6c 75 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d  luated.** at com
22f0: 70 69 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72  pile-time, not r
2300: 75 6e 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73  un-time (at leas
2310: 74 20 66 6f 72 20 67 63 63 20 74 68 69 73 20 69  t for gcc this i
2320: 73 20 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66  s true)..*/.#def
2330: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c  ine N_PG_HASH (\
2340: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30  .  (MAX_PAGES>10
2350: 32 34 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d  24)?2048: \.  (M
2360: 41 58 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30  AX_PAGES>512)?10
2370: 32 34 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  24: \.  (MAX_PAG
2380: 45 53 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20  ES>256)?512: \. 
2390: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29   (MAX_PAGES>128)
23a0: 3f 32 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50  ?256: \.  (MAX_P
23b0: 41 47 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20  AGES>64)?128:64 
23c0: 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  \.)../*.** Hash 
23d0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
23e0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
23f0: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
2400: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
2410: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
2420: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
2430: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2440: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2450: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
2460: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
2470: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
2480: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
2490: 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  , SQLITE_PROTOCO
24a0: 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46  L.** or SQLITE_F
24b0: 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66  ULL. Once one of
24c0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
24d0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20   errors occurs, 
24e0: 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61  it persists.** a
24f0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  nd is returned a
2500: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
2510: 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65  every major page
2520: 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65  r API call.  The
2530: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
2540: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2550: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
2560: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
2570: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
2580: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
2590: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
25a0: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
25b0: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
25c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
25d0: 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
25e0: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
25f0: 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  _get() and sqlit
2600: 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
2610: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
2620: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
2630: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
2640: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2650: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2660: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2670: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2680: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2690: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
26a0: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
26b0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
26c0: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
26d0: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
26e0: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
26f0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2700: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
2710: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
2720: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2730: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2750: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2760: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2770: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2780: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
27b0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
27c0: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
27d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27e0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
27f0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
2800: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
2810: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
2820: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2830: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2840: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2850: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2860: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2880: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2890: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
28a0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
28b0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
28c0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
28d0: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
28e0: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
28f0: 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  ss */.  u8 state
2900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2910: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
2920: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
2930: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
2940: 0a 20 20 75 38 20 65 72 72 43 6f 64 65 3b 20 20  .  u8 errCode;  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2960: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
2970: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
2980: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2990: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29a0: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
29b0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
29c0: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
29d0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
29e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
29f0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
2a00: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2a10: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2a20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a30: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2a40: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2a50: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2a60: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2a70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a80: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2a90: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2aa0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2ab0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
2ac0: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
2ad0: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
2ae0: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
2af0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2b00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2b10: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
2b20: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65  e I/O */.  u8 se
2b30: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2b40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b50: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
2b60: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2b70: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20 64   jrnl */.  int d
2b80: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2b90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ba0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2bb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
2bc0: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
2bd0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
2be0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
2bf0: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
2c00: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c20: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2c30: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
2c40: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
2c50: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2c80: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2c90: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
2ca0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
2cb0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
2cc0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
2cd0: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
2ce0: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
2cf0: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
2d00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d10: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
2d20: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
2d30: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d50: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
2d60: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
2d70: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2d80: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2da0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2db0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
2dc0: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2de0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
2df0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
2e00: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67 65  /.  int nMaxPage
2e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e20: 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d 61  /* High water ma
2e30: 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20  rk of nPage */. 
2e40: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
2e70: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
2e80: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
2e90: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2ec0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
2ed0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  in cache */.  u8
2ee0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
2ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2f00: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2f10: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2f20: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
2f30: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
2f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f50: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f60: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f70: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
2f80: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2f90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2fa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
2fc0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2fd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2ff0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
3000: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
3010: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
3020: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
3030: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
3040: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  OsFile *fd, *jfd
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
3060: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
3070: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
3080: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
3090: 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  File *stfd;     
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
30b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
30c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
30d0: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
30e0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
30f0: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
3100: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
3110: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
3120: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
3130: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
3140: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
3150: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
3160: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
3170: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
3180: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
3190: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
31a0: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
31d0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
31e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
31f0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
3200: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
3210: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3220: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3230: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
3240: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
3250: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
3260: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3270: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
3280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3290: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
32a0: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
32b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
32c0: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
32d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
32e0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
32f0: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
3300: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
3310: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
3330: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
3340: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
3350: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
3360: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3370: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
3380: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
3390: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
33a0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
33b0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
33c0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
33d0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
33e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33f0: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3400: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
3410: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
3420: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
3430: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
3440: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
3450: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3460: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
3470: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
3480: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
3490: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
34a0: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
34b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
34c0: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
34d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
34e0: 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  iter)(void*,int)
34f0: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
3500: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
3510: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
3520: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
3530: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3540: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3550: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3560: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3570: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3590: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
35a0: 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 50 67 48  Codec() */.  PgH
35b0: 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48  dr *aHash[N_PG_H
35c0: 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68  ASH];    /* Hash
35d0: 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61   table to map pa
35e0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48  ge number to PgH
35f0: 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  dr */.#ifdef SQL
3600: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3610: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3620: 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20  ager *pNext;    
3630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
3640: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
3650: 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65  ers in this thre
3660: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ad */.#endif.};.
3670: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
3680: 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
3690: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
36a0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 67 69 76  the variable giv
36b0: 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67  en in.** the arg
36c0: 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20  ument.*/.#ifdef 
36d0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65  SQLITE_TEST.# de
36e0: 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78  fine TEST_INCR(x
36f0: 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  x++.#else.# d
3700: 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28  efine TEST_INCR(
3710: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
3720: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3730: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3740: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3750: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3760: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3770: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3780: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3790: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
37a0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
37b0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
37c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
37d0: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
37e0: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
37f0: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3800: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3810: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3820: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3830: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
3840: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3850: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3860: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3870: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3880: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3890: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
38a0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
38b0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
38c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
38d0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
38e0: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
38f0: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3900: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3910: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3920: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3930: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3940: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3950: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3960: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3970: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3980: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3990: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
39a0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
39b0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
39c0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
39d0: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
39e0: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
39f0: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
3a00: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
3a10: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
3a20: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
3a30: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
3a40: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
3a50: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
3a60: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
3a70: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
3a80: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3a90: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
3aa0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
3ab0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
3ac0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
3ad0: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
3ae0: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
3af0: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
3b00: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
3b10: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
3b20: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
3b30: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
3b40: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
3b50: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
3b60: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
3b70: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
3b80: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
3b90: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
3ba0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
3bb0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
3bc0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
3bd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
3be0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
3bf0: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
3c00: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
3c10: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
3c20: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
3c30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
3c40: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
3c50: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
3c60: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
3c70: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
3c80: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
3c90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
3ca0: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
3cb0: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
3cc0: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
3cd0: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
3ce0: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
3cf0: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
3d00: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
3d10: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
3d20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3d30: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
3d40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
3d50: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
3d60: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
3d70: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
3d80: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
3d90: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
3da0: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
3db0: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
3dc0: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
3dd0: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
3de0: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
3df0: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
3e00: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
3e10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
3e20: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
3e30: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
3e40: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
3e50: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
3e60: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
3e70: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
3e80: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
3e90: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
3ea0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
3eb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3ec0: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
3ed0: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
3ee0: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
3ef0: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
3f00: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
3f10: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
3f20: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
3f30: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
3f40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3f50: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3f60: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
3f70: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
3f80: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
3f90: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
3fa0: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  ** The default s
3fb0: 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65  ize of a disk se
3fc0: 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ctor.*/.#define 
3fd0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
3fe0: 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  E 512../*.** Pag
3ff0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
4000: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
4010: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
4020: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4030: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4040: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4050: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4060: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4070: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4080: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
4090: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
40a0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
40b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40c0: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
40d0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
40e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
40f0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
4100: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
4110: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
4120: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4130: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4140: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4150: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4160: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4170: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4180: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
4190: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
41a0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
41b0: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
41c0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
41d0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
41e0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
41f0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4200: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4210: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4220: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4230: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4240: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4250: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4260: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4270: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4280: 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  UG.  int pager3_
4290: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
42a0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
42b0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
42c0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
42d0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
42e0: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
42f0: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4300: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
4310: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4320: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
4330: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
4340: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
4350: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44     p->pgno, PGHD
4360: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
4370: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4380: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
4390: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
43a0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
43b0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
43c0: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
43d0: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
43e0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
43f0: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  O(X).#endif../*.
4400: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4410: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4420: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4430: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4440: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4450: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4460: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4470: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4480: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4490: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
44a0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
44b0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
44c0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
44d0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
44e0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
44f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4500: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4510: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4520: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4530: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4540: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4550: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4560: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4580: 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32  pRes = (ac[0]<<2
4590: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
45a0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
45b0: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ac[3];.  }.  ret
45c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
45d0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
45e0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
45f0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4600: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4610: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
4620: 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28   void put32bits(
4630: 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61  char *ac, u32 va
4640: 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  l){.  ac[0] = (v
4650: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
4660: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
4670: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
4680: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
4690: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
46a0: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
46b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
46c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
46d0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
46e0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
46f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
4700: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
4710: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
4720: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4730: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
4740: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
4750: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4760: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
4770: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
4780: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
4790: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
47a0: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
47b0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
47c0: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
47d0: 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20   'val' into the 
47e0: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
47f0: 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a  by page header.*
4800: 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20  * 'p' at offset 
4810: 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61  'offset'..*/.sta
4820: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32  tic void store32
4830: 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67  bits(u32 val, Pg
4840: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
4850: 65 74 29 7b 0a 20 20 63 68 61 72 20 2a 61 63 3b  et){.  char *ac;
4860: 0a 20 20 61 63 20 3d 20 26 28 28 63 68 61 72 2a  .  ac = &((char*
4870: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4880: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 70 75  ))[offset];.  pu
4890: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
48a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
48b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
48c0: 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73   at offset 'offs
48d0: 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67  et' from the pag
48e0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  e identified by.
48f0: 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27  ** page header '
4900: 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  p'..*/.static u3
4910: 32 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  2 retrieve32bits
4920: 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f  (PgHdr *p, int o
4930: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
4940: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
4950: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
4960: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
4970: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
4980: 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d  .  return (ac[0]
4990: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
49a0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
49b0: 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a   | ac[3];.}.../*
49c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
49d0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
49e0: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
49f0: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
4a00: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
4a10: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
4a20: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
4a30: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
4a40: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
4a50: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
4a60: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
4a70: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
4a80: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
4a90: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
4aa0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
4ab0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
4ac0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
4ad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
4ae0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
4af0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
4b00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
4b10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
4b20: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c  SQLITE_PROTOCOL,
4b30: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
4b40: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
4b50: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
4b60: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
4b70: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
4b80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
4b90: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
4ba0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
4bb0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
4bc0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
4bd0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 61 73 73  , int rc){.  ass
4be0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
4bf0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4c00: 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  L || pPager->err
4c10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
4c20: 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63  );.  if( .    rc
4c30: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
4c40: 20 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45   .    rc==SQLITE
4c50: 5f 49 4f 45 52 52 20 7c 7c 20 0a 20 20 20 20 72  _IOERR || .    r
4c60: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
4c70: 54 20 7c 7c 0a 20 20 20 20 72 63 3d 3d 53 51 4c  T ||.    rc==SQL
4c80: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29  ITE_PROTOCOL.  )
4c90: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
4ca0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
4cb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4cc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
4cd0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
4ce0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
4cf0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
4d00: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
4d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
4d20: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
4d30: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75  Hdr *pPage){.  u
4d40: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4d50: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
4d60: 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28   char *pData = (
4d70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4d80: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
4d90: 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  age);.  for(i=0;
4da0: 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72   i<pPage->pPager
4db0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29  ->pageSize; i++)
4dc0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
4dd0: 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a  sh+i)^pData[i];.
4de0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
4df0: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  h;.}../*.** The 
4e00: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
4e10: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
4e20: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
4e30: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
4e40: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
4e50: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
4e60: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
4e70: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
4e80: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
4e90: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
4ea0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
4eb0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
4ec0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
4ed0: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
4ee0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
4ef0: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
4f00: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
4f10: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
4f20: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
4f30: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
4f40: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
4f50: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
4f60: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
4f70: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
4f80: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
4f90: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
4fa0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
4fb0: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
4fc0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
4fd0: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
4fe0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
4ff0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5000: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5010: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5020: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
5030: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5040: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
5050: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
5060: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
5070: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
5080: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
5090: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
50a0: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
50b0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
50c0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
50d0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
50e0: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
50f0: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
5100: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
5110: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
5120: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5130: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
5140: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
5150: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
5160: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5180: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
5190: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
51a0: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
51b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
51c0: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
51d0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
51e0: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
51f0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
5200: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
5210: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
5220: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
5230: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
5240: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5250: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
5260: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5270: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
5280: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5290: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
52a0: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
52b0: 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  6);.  if( rc!=SQ
52c0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
52d0: 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65   rc;. .  rc = re
52e0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
52f0: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
5300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5310: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5320: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
5330: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
5340: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5350: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5360: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5370: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
5380: 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   8);.  if( rc!=S
5390: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
53a0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
53b0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
53c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
53d0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
53e0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65  pJrnl, szJ-16-le
53f0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5400: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5410: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
5420: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
5430: 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b  teMalloc(len+1);
5440: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
5450: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
5460: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5470: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
5480: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
5490: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
54a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
54b0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
54c0: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
54d0: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
54e0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   0;.    return r
54f0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
5500: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
5510: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
5520: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5530: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
5540: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5550: 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73  cksum -= (*pzMas
5560: 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  ter)[i];.  }.  i
5570: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
5580: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
5590: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
55a0: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
55b0: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
55c0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
55d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
55e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
55f0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
5600: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
5610: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
5620: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
5630: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
5640: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
5650: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
5660: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
5670: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
5680: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
5690: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
56a0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
56b0: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
56c0: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
56d0: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
56e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
56f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
5700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
5710: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
5720: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
5730: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
5740: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
5750: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
5760: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
5770: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
5780: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
5790: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
57a0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
57b0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
57c0: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
57d0: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
57e0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
57f0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
5820: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5830: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
5840: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
5850: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5860: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
5870: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5880: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
5890: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
58a0: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ** .*/.static in
58b0: 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  t seekJournalHdr
58c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
58d0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
58e0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
58f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5900: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
5910: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
5920: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5930: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
5940: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5950: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
5960: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
5970: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5980: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
5990: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
59a0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
59b0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
59c0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
59d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
59e0: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
59f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
5a00: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
5a10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5a20: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
5a30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5a40: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5a50: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
5a60: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5a70: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
5a80: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5a90: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
5aa0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
5ab0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
5ac0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
5ad0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
5ae0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
5af0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
5b00: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
5b10: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
5b20: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
5b30: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
5b40: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
5b50: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
5b60: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
5b70: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
5b80: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
5b90: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
5ba0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
5bb0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
5bc0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
5bd0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
5be0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
5bf0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
5c00: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
5c10: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
5c20: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
5c30: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
5c40: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
5c50: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
5c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5c70: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
5c80: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5c90: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
5ca0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5cb0: 69 63 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20  ic)+16];..  int 
5cc0: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
5cd0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
5ce0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5cf0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
5d00: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
5d10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5d20: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5d30: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5d40: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5d50: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5d60: 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20  ournalHdr;.  }. 
5d70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5d80: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
5d90: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
5da0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20    /* FIX ME: .  
5db0: 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  **.  ** Possibly
5dc0: 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74   for a pager not
5dd0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
5de0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61  , the journal ma
5df0: 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20  gic should not. 
5e00: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75   ** be written u
5e10: 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c  ntil nRec is fil
5e20: 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f  led in as part o
5e30: 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e  f next syncJourn
5e40: 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  al(). .  **.  **
5e50: 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20   Actually maybe 
5e60: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
5e70: 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20  l header should 
5e80: 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  be delayed until
5e90: 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74   that.  ** point
5ea0: 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  . Think about th
5eb0: 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  is..  */.  memcp
5ec0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
5ed0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
5ee0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
5ef0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20  ;.  /* The nRec 
5f00: 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46  Field. 0xFFFFFFF
5f10: 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f  F for no-sync jo
5f20: 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74  urnals. */.  put
5f30: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
5f40: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
5f50: 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
5f60: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
5f70: 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54  fff : 0);.  /* T
5f80: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
5f90: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
5fa0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61   */ .  sqlite3Ra
5fb0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
5fc0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
5fd0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
5fe0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
5ff0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6000: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6010: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
6020: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
6030: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
6040: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
6050: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6060: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6070: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
6080: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
6090: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
60a0: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
60b0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
60c0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
60d0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
60e0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
60f0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
6100: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
6110: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6120: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
6130: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
6140: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
6150: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
6160: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
6170: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
6180: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
6190: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
61a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
61b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
61c0: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
61d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
61e0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
61f0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
6200: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
6210: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
6220: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6240: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6250: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6260: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6270: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6280: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6290: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
62a0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
62b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
62c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
62d0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
62e0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
62f0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6300: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6310: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6320: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
6330: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6340: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6350: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6360: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6370: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6380: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6390: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
63a0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
63b0: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
63e0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
63f0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
6400: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6410: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
6420: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
6430: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6440: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6450: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6460: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6470: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6480: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6490: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
64a0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
64b0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
64c0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
64d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
64e0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
64f0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6500: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6510: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6520: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6530: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6540: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6550: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6560: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6570: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6580: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6590: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
65a0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
65b0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
65c0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
65d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
65e0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
65f0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6600: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6610: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6620: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6630: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6640: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6650: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6660: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6670: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6680: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6690: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
66a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
66b0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
66c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
66d0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
66e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
66f0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6700: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6710: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
6720: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6730: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
6740: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6750: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6760: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6780: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6790: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
67a0: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
67b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
67c0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
67d0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
67e0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
67f0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
6800: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6810: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6820: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
6830: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
6840: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6850: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
6860: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
6870: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
6880: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
6890: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
68a0: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
68b0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
68c0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
68d0: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
68e0: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
68f0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
6900: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
6910: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
6920: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
6930: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
6940: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
6950: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
6960: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
6970: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
6980: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
6990: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
69a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
69b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
69c0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
69d0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
69e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
69f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6a00: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
6a10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6a20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
6a30: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
6a40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6a50: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
6a60: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
6a70: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
6a80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6a90: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
6aa0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
6ab0: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
6ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6ad0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
6ae0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
6af0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
6b00: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
6b10: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
6b20: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
6b30: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
6b40: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
6b50: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
6b60: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
6b70: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
6b80: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
6b90: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
6ba0: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
6bb0: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
6bc0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
6bd0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
6be0: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
6bf0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
6c00: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
6c10: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
6c20: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
6c30: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
6c40: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
6c50: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
6c60: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
6c70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
6c80: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
6c90: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
6ca0: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
6cb0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
6cc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
6cd0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
6ce0: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
6cf0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
6d00: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
6d10: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
6d20: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
6d30: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
6d40: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
6d50: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
6d60: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
6d70: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
6d80: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
6d90: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
6da0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
6db0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6dc0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
6dd0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
6de0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
6df0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6e00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
6e10: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
6e20: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
6e30: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
6e40: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
6e50: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
6e60: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
6e70: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
6e80: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
6e90: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
6ea0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
6eb0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
6ec0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6ed0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
6ee0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
6ef0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
6f00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
6f10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
6f20: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
6f30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
6f40: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
6f50: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6f60: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
6f70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6f80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
6f90: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6fa0: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
6fb0: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
6fc0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
6fd0: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
6fe0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
6ff0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7000: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
7010: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7020: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7030: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
7040: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7050: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7060: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7070: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
7080: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7090: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
70a0: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
70b0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
70c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
70d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
70e0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
70f0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
7100: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7110: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
7120: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
7130: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
7140: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7150: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7160: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7170: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
7180: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
7190: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
71a0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
71b0: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
71c0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
71d0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
71e0: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
71f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
7200: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
7210: 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  s the sqlite3pag
7220: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29  er_stmt_commit()
7230: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
7240: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
7250: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
7260: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
7270: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
7280: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
7290: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
72a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
72b0: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
72c0: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
72d0: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
72e0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
72f0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
7300: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
7310: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
7320: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
7330: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
7340: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
7350: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
7360: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
7370: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7380: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
7390: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
73a0: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
73b0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
73c0: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
73d0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
73e0: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
73f0: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
7400: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
7410: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
7420: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
7430: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
7440: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
7450: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
7460: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7470: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
7480: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
7490: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
74a0: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
74b0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
74c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
74d0: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
74e0: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
74f0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
7500: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
7510: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
7520: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
7530: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
7540: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
7550: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
7560: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7570: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
7580: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
7590: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
75a0: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
75b0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
75c0: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
75d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
75e0: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
75f0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
7600: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
7610: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
7620: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7630: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
7640: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
7650: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
7660: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
7670: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
7680: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
7690: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
76a0: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d  ager_hash(pgno)]
76b0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
76c0: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
76d0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
76e0: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
76f0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
7700: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
7710: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
7720: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
7730: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7740: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
7750: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
7760: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
7770: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
7780: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
7790: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
77a0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
77b0: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
77c0: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
77d0: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
77e0: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
77f0: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
7800: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
7810: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7820: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
7830: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7840: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
7850: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
7860: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
7870: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7880: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
7890: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
78a0: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
78b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
78c0: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
78d0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
78e0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
78f0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
7900: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
7910: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
7920: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   0;.  memset(pPa
7930: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
7940: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
7950: 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ash));.  pPager-
7960: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  >nPage = 0;.  if
7970: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
7980: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
7990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
79a0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
79b0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
79c0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
79d0: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
79e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
79f0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
7a00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
7a10: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
7a20: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
7a30: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
7a40: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
7a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
7a60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7a70: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
7a80: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
7a90: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
7aa0: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
7ab0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
7ac0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
7ad0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7ae0: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
7af0: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
7b00: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
7b10: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
7b20: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
7b30: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
7b40: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
7b50: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
7b60: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
7b70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7b80: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
7b90: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
7ba0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
7bb0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
7bc0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
7bd0: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
7be0: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
7bf0: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
7c00: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
7c10: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
7c20: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
7c30: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
7c40: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
7c50: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
7c60: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7c70: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
7c80: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
7c90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7ca0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
7cb0: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
7cc0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7cd0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
7ce0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
7cf0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
7d00: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
7d10: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
7d20: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
7d30: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
7d40: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7d50: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
7d60: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7d70: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
7d80: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
7d90: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
7da0: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
7db0: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
7dc0: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
7dd0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7de0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
7df0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
7e00: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
7e10: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
7e20: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
7e30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7e40: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
7e50: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
7e60: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
7e70: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
7e80: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
7e90: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
7ea0: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
7eb0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7ec0: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
7ed0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
7ee0: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
7ef0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
7f00: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
7f10: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
7f20: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
7f30: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
7f40: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
7f50: 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   );.  }.  rc = s
7f60: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
7f70: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
7f80: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
7f90: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
7fa0: 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65  _SHARED;.  pPage
7fb0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
7fc0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
7fd0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65  Master = 0;.  re
7fe0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7ff0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
8000: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
8010: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
8020: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
8030: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
8040: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
8050: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
8060: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
8070: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
8080: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
8090: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
80a0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
80b0: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
80c0: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
80d0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
80e0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
80f0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
8100: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
8110: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
8120: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
8130: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
8140: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
8150: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
8160: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
8170: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
8180: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
8190: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
81a0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
81b0: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
81c0: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
81d0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
81e0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
81f0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
8200: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
8210: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
8220: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
8230: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
8240: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
8250: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
8260: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
8270: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
8280: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
8290: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
82a0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
82b0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
82c0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
82d0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
82e0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
82f0: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
8300: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
8310: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
8320: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
8330: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
8340: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
8350: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
8360: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
8370: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
8380: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
8390: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
83a0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
83b0: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
83c0: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
83d0: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
83e0: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
83f0: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
8400: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
8410: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
8420: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63  er, Pgno pgno, c
8430: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
8440: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
8450: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8460: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
8470: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
8480: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
8490: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
84a0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
84b0: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
84c0: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
84d0: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
84e0: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
84f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8500: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
8510: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
8520: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
8530: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
8540: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
8550: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
8560: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
8570: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
8580: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
8590: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
85a0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
85b0: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
85c0: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
85d0: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
85e0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
85f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8600: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
8610: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
8620: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
8630: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
8640: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
8650: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
8660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8670: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
8680: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
8690: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
86c0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
86d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
86e0: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
8700: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
8710: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8720: 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51  */.  u8 aData[SQ
8730: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8740: 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74  ZE];  /* Temp st
8750: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
8760: 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73   */..  /* useCks
8770: 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  um should be tru
8780: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a  e for the main j
8790: 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65  ournal and false
87a0: 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d   for.  ** statem
87b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56  ent journals.  V
87c0: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
87d0: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
87e0: 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  se.  */.  assert
87f0: 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73  ( jfd == (useCks
8800: 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  um ? pPager->jfd
8810: 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29   : pPager->stfd)
8820: 20 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61   );...  rc = rea
8830: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
8840: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
8850: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8860: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
8870: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
8880: 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  &aData, pPager->
8890: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28  pageSize);.  if(
88a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
88b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
88c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
88d0: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
88e0: 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20  Size + 4;..  /* 
88f0: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
8900: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
8910: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
8920: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
8930: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
8940: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
8950: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
8960: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
8970: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
8980: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
8990: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
89a0: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
89b0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
89c0: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
89d0: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
89e0: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
89f0: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
8a00: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
8a10: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
8a20: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
8a30: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
8a40: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
8a50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8a60: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
8a70: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
8a80: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
8a90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8aa0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
8ab0: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
8ac0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
8ad0: 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  d, &cksum);.    
8ae0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
8af0: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
8b00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
8b10: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
8b20: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e  ksum(pPager, pgn
8b30: 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  o, aData)!=cksum
8b40: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8b50: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8b60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
8b70: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
8b80: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
8b90: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
8ba0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
8bb0: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
8bc0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
8bd0: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
8be0: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
8bf0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
8c00: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
8c10: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
8c20: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
8c30: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
8c40: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
8c50: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
8c60: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
8c70: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
8c80: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
8c90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
8ca0: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
8cb0: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
8cc0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
8cd0: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
8ce0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
8cf0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
8d00: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
8d10: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
8d20: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
8d30: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
8d40: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
8d50: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
8d60: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
8d70: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
8d80: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
8d90: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
8da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8db0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
8dc0: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
8dd0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
8de0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
8df0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
8e00: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
8e10: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
8e20: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
8e30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
8e40: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
8e50: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
8e60: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
8e70: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
8e80: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
8e90: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
8ea0: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
8eb0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20  contents are in 
8ec0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
8ed0: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
8ee0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
8ef0: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f   full ROLLBACK o
8f00: 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
8f10: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72  statement.  ** r
8f20: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c  ollback the full
8f30: 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e   ROLLBACK will n
8f40: 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70  ot restore the p
8f50: 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  age to its origi
8f60: 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  nal.  ** content
8f70: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
8f80: 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65  s must be met be
8f90: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
8fa0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
8fb0: 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  * files. (1) the
8fc0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
8fd0: 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  e locked.  (2) w
8fe0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
8ff0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61  original.  ** pa
9000: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e  ge content is in
9010: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
9020: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
9030: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
9040: 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f   in.  ** cache o
9050: 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72  r else it is mar
9060: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
9070: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
9080: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
9090: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
90a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
90b0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
90c0: 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20  USIVE || pPg!=0 
90d0: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41  );.  TRACE3("PLA
90e0: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
90f0: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
9100: 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ger), pgno);.  i
9110: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
9120: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9130: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
9140: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
9150: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
9160: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
9170: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
9180: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
9190: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
91a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
91b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
91c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
91d0: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
91e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
91f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9200: 70 50 67 20 29 20 70 50 67 2d 3e 64 69 72 74 79  pPg ) pPg->dirty
9210: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
9220: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
9230: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
9240: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
9250: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
9260: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
9270: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
9280: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
9290: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
92a0: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
92b0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
92c0: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
92d0: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
92e0: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
92f0: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
9300: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
9310: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
9320: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
9330: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
9340: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
9350: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
9360: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
9370: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
9380: 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  /* assert( pPg->
9390: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
93a0: 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  pgno==1 ); */.  
93b0: 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f    pData = PGHDR_
93c0: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
93d0: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
93e0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
93f0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
9400: 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
9410: 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46  uctor ){  /*** F
9420: 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74  IX ME:  Should t
9430: 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20  his be xReinit? 
9440: 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  ***/.      pPage
9450: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
9460: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9470: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
9480: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
9490: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
94a0: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
94b0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
94c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44  ;.#endif.    COD
94d0: 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
94e0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
94f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
9510: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
9520: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
9530: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9540: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
9550: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
9560: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
9570: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9580: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
9590: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
95a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
95b0: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
95c0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
95d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
95e0: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
95f0: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
9600: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
9610: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9620: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
9630: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
9640: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
9650: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
9660: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
9670: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
9680: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
9690: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
96a0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
96b0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
96c0: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
96d0: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
96e0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
96f0: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
9700: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
9710: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
9720: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9730: 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74  _delmaster(const
9740: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
9750: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
9760: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
9770: 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74  ;.  OsFile *mast
9780: 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
9790: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
97a0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
97b0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
97c0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
97d0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
97e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
97f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9800: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
9810: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
9820: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
9830: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
9840: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
9850: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
9860: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
9870: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
9880: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
9890: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
98a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
98b0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d  sOpenReadOnly(zM
98c0: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b  aster, &master);
98d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
98e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
98f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
9900: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  ter_open = 1;.  
9910: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
9920: 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26  leSize(master, &
9930: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
9940: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9950: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
9960: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
9970: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
9980: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
9990: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
99a0: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
99b0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   0;..    /* Load
99c0: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
99d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
99e0: 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
99f0: 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ned from.    ** 
9a00: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
9a10: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
9a20: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
9a30: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
9a40: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
9a50: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
9a60: 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
9a70: 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61  l);.    if( !zMa
9a80: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9a90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9aa0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
9ab0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9ac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
9ad0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d   sqlite3OsRead(m
9ae0: 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
9af0: 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f  urnal, nMasterJo
9b00: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
9b10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9b20: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9b30: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
9b40: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
9b50: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
9b60: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
9b70: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
9b80: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
9b90: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
9ba0: 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61  leExists(zJourna
9bb0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  l) ){.        /*
9bc0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
9bd0: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
9be0: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
9bf0: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
9c00: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
9c10: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
9c20: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
9c30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
9c40: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
9c50: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
9c60: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
9c70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9c80: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9c90: 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75       OsFile *jou
9ca0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
9cb0: 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20    int c;..      
9cc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9cd0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f  OpenReadOnly(zJo
9ce0: 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29  urnal, &journal)
9cf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9d00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9d10: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
9d20: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
9d30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
9d40: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
9d50: 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20  ournal(journal, 
9d60: 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  &zMasterPtr);.  
9d70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
9d80: 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a  lose(&journal);.
9d90: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9da0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9db0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
9dc0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
9dd0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
9de0: 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20  = zMasterPtr!=0 
9df0: 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
9e00: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
9e10: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
9e20: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72  eFree(zMasterPtr
9e30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
9e40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9e50: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
9e60: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
9e70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9e80: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
9e90: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9ea0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9eb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9ec0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
9ed0: 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b  trlen(zJournal)+
9ee0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
9ef0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  .  sqlite3OsDele
9f00: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
9f10: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
9f20: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
9f30: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
9f40: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
9f50: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
9f60: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
9f70: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9f80: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
9f90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9fa0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72  ./*.** Make ever
9fb0: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  y page in the ca
9fc0: 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77  che agree with w
9fd0: 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20  hat is on disk. 
9fe0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
9ff0: 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64  .** reread the d
a000: 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65  isk to reset the
a010: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61   state of the ca
a020: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
a030: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a040: 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  d after a rollba
a050: 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65  ck in which some
a060: 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61   of the dirty ca
a070: 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64  che.** pages had
a080: 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
a090: 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e  ten out to disk.
a0a0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
a0b0: 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61  l back the.** ca
a0c0: 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  che content and 
a0d0: 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  the easiest way 
a0e0: 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f  to do that is to
a0f0: 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20   reread the old 
a100: 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20  content.** back 
a110: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a  from the disk..*
a120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a130: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
a140: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a150: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
a160: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a170: 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  OK;.  for(pPg=pP
a180: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
a190: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
a1a0: 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  ll){.    char zB
a1b0: 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  uf[SQLITE_MAX_PA
a1c0: 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66  GE_SIZE];.    if
a1d0: 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20  ( !pPg->dirty ) 
a1e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
a1f0: 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
a200: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
a210: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
a220: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
a230: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ek(pPager->fd, p
a240: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a250: 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
a260: 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  1));.      if( r
a270: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a280: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
a290: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
a2a0: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
a2b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
a2d0: 41 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64  ACE3("REFETCH %d
a2e0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
a2f0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
a300: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
a310: 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
a320: 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
a330: 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70  er, zBuf, pPg->p
a340: 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c  gno, 2);.    }el
a350: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
a360: 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72  (zBuf, 0, pPager
a370: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a380: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
a390: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
a3a0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
a3b0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
a3c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
a3d0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47  .      memcpy(PG
a3e0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a3f0: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
a400: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a410: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
a420: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
a430: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
a440: 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
a450: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
a460: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a480: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
a490: 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
a4a0: 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
a4b0: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
a4c0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e      }.    pPg->n
a4d0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
a4e0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
a4f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a500: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a510: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a520: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a530: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  g);.#endif.  }. 
a540: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a550: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
a560: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
a570: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
a580: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
a590: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
a5a0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a5b0: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
a5c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a5d0: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  int nPage){.  as
a5e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
a5f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
a600: 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  SIVE );.  return
a610: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
a620: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
a630: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a640: 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a  (i64)nPage);.}..
a650: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
a660: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
a670: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
a680: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
a690: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
a6a0: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
a6b0: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
a6c0: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
a6d0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
a6e0: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
a6f0: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
a700: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
a710: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
a720: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a730: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
a740: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
a750: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a760: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
a770: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
a780: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
a790: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
a7a0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
a7b0: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
a7c0: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
a7d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
a7e0: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
a7f0: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
a800: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
a810: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
a820: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
a830: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
a840: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
a850: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
a860: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
a870: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
a880: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
a890: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
a8a0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
a8b0: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
a8c0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
a8d0: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
a8e0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
a8f0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a900: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
a910: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
a920: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
a930: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
a940: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
a950: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
a960: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
a970: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
a980: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
a990: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
a9a0: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
a9b0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
a9c0: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
a9d0: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
a9e0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
a9f0: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
aa00: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
aa10: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
aa20: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
aa30: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
aa40: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
aa50: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
aa60: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
aa70: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
aa80: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
aa90: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
aaa0: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
aab0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
aac0: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
aad0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
aae0: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
aaf0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
ab00: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
ab10: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
ab20: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
ab30: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
ab40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
ab50: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
ab60: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
ab70: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
ab80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
ab90: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
aba0: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
abb0: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
abc0: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
abd0: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
abe0: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
abf0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
ac00: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
ac10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
ac20: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
ac30: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
ac40: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
ac50: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
ac60: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ac70: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
ac80: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
ac90: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
aca0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
acb0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
acc0: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
acd0: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
ace0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
acf0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
ad00: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
ad10: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
ad20: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
ad30: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
ad40: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
ad50: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
ad60: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
ad70: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
ad80: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
ad90: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
ada0: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
adb0: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
adc0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
add0: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
ade0: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
adf0: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
ae00: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
ae10: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
ae20: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
ae30: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
ae40: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
ae50: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
ae60: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
ae70: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
ae80: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
ae90: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
aea0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
aeb0: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
aec0: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
aed0: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
aee0: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
aef0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
af00: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
af10: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
af20: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
af30: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
af40: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
af50: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
af60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
af70: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
af80: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
af90: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
afa0: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
afb0: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
afc0: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
afd0: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
afe0: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
aff0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
b000: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
b010: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
b020: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
b030: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
b040: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
b050: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
b060: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
b070: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
b080: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
b090: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
b0a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
b0b0: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
b0c0: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
b0d0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
b0e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b0f0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
b100: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b110: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
b120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b130: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b140: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
b150: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b170: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
b180: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
b190: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
b1c0: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
b1d0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
b1e0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
b1f0: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
b200: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
b230: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
b240: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
b250: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
b260: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
b270: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
b280: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
b290: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
b2a0: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
b2b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
b2c0: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
b2d0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
b2e0: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
b2f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b300: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
b310: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
b320: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b330: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
b340: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b350: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
b360: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
b370: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
b380: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b390: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
b3a0: 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
b3b0: 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
b3c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b3d0: 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
b3e0: 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
b3f0: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
b400: 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
b410: 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
b420: 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
b430: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
b440: 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
b450: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
b460: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
b470: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
b480: 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73   &zMaster);.  as
b490: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
b4a0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
b4b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
b4c0: 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c  (zMaster && !sql
b4d0: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
b4e0: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
b4f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
b500: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
b510: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
b520: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
b530: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
b540: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
b550: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
b560: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
b570: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
b580: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b590: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
b5a0: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
b5b0: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
b5c0: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
b5d0: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
b5e0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
b5f0: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
b600: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
b610: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
b620: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
b630: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
b640: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
b650: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
b660: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
b670: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
b680: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b690: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
b6a0: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
b6b0: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
b6c0: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
b6d0: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
b6e0: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
b6f0: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
b700: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
b710: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
b720: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
b730: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
b740: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
b750: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
b760: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
b770: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b780: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
b790: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
b7a0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
b7b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b7c0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
b7d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
b7e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
b7f0: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
b800: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
b810: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
b820: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
b830: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
b840: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
b850: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
b860: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
b870: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
b880: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
b890: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
b8a0: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
b8b0: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
b8c0: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
b8d0: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
b8e0: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
b8f0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
b900: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
b910: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
b920: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
b930: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
b940: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
b950: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
b960: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
b970: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
b980: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
b990: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
b9a0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
b9b0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
b9c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
b9d0: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
b9e0: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
b9f0: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
ba00: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
ba10: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
ba20: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
ba30: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
ba40: 45 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  E && .        pP
ba50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ba60: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
ba70: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
ba80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ba90: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
baa0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
bab0: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
bac0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
bad0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
bae0: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
baf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bb00: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bb10: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bb20: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
bb30: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
bb40: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
bb50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
bb60: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
bb70: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
bb80: 70 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20  pPager)); */.   
bb90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bba0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  OK ) goto end_pl
bbb0: 61 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f  ayback;.  .    /
bbc0: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
bbd0: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
bbe0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
bbf0: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
bc00: 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
bc10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bc20: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
bc30: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
bc40: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
bc50: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
bc60: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
bc70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bc80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
bc90: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
bca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
bcb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
bcc0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bcd0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
bce0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bcf0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
bd00: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
bd10: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
bd20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bd30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
bd40: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
bd50: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
bd60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
bd70: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
bd80: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
bd90: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
bda0: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
bdb0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
bdc0: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
bdd0: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
bde0: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
bdf0: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
be00: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
be10: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
be20: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
be30: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
be40: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
be50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
be60: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
be70: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
be80: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
be90: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
bea0: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
beb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
bec0: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
bed0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
bee0: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
bef0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
bf00: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
bf10: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
bf20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
bf30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bf40: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
bf50: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
bf60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bf70: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
bf80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
bf90: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
bfa0: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
bfb0: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
bfc0: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
bfd0: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
bfe0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
bff0: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
c000: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
c010: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
c020: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
c030: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
c040: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
c050: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
c060: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
c070: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c080: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
c090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
c0a0: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
c0b0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c0c0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
c0d0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
c0e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c0f0: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
c100: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
c110: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
c120: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
c130: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
c140: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
c150: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
c160: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
c170: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
c180: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
c190: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
c1a0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
c1b0: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
c1c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
c1d0: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
c1e0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c1f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c200: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
c210: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
c220: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
c230: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c240: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
c250: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
c260: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
c270: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c280: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
c290: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
c2a0: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
c2d0: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
c2e0: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
c2f0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
c300: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c310: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
c320: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c340: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
c350: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
c360: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c370: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
c380: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
c390: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
c3a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c3b0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
c3c0: 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69   &os_szJ);.    i
c3d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c3e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c3f0: 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f    assert( szJ==o
c400: 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e  s_szJ );.  }.#en
c410: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64  dif..  /* Set hd
c420: 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f  rOff to be the o
c430: 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  ffset to the fir
c440: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
c450: 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  r written.  ** t
c460: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
c470: 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68  ansaction, or th
c480: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
c490: 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
c4a0: 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
c4b0: 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
c4c0: 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
c4d0: 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
c4e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
c4f0: 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
c500: 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
c510: 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
c520: 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
c530: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
c540: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
c550: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
c560: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  size..  */.  if(
c570: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
c580: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
c590: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
c5a0: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
c5b0: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
c5c0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
c5d0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
c5e0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
c5f0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
c600: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
c610: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
c620: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
c630: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
c640: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
c650: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
c660: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
c670: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
c680: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
c690: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
c6a0: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
c6b0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
c6c0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
c6d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
c6e0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c6f0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
c700: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
c710: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c720: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
c730: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
c740: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
c750: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
c760: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
c770: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
c780: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
c790: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
c7a0: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
c7b0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
c7c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c7d0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c7e0: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
c7f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
c800: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
c810: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
c820: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
c830: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
c840: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
c850: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
c860: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
c870: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
c880: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
c890: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
c8a0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c8b0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
c8c0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
c8d0: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
c8e0: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
c8f0: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
c900: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
c910: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
c920: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
c930: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
c940: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
c950: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
c960: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
c970: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
c980: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c990: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
c9a0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
c9b0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
c9c0: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
c9d0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
c9e0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
c9f0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
ca00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
ca10: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
ca20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ca30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
ca40: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
ca50: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
ca60: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
ca70: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
ca80: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
ca90: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
caa0: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65  tmtCksum;.  asse
cab0: 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  rt( JOURNAL_HDR_
cac0: 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67  SZ(pPager)<(pPag
cad0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20  er->pageSize+8) 
cae0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  );.  while( pPag
caf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
cb00: 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65  = (hdrOff-(pPage
cb10: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20  r->pageSize+8)) 
cb20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
cb30: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
cb40: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
cb50: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
cb60: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
cb70: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
cb80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cb90: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
cba0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
cbb0: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
cbc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
cbd0: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52  zJ ){.    u32 nR
cbe0: 65 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d  ec;.    u32 dumm
cbf0: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
cc00: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
cc10: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
cc20: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
cc30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cc40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
cc50: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cc60: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
cc70: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
cc80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
cc90: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
cca0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
ccb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
ccc0: 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
ccd0: 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
cce0: 20 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b     for(i=nRec-1;
ccf0: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
cd00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
cd10: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
cd20: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cd30: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cd40: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cd50: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
cd60: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cd70: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
cd80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cd90: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
cda0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
cdb0: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
cdc0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cdd0: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
cde0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
cdf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ce00: 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
ce10: 28 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  (pPager, SQLITE_
ce20: 43 4f 52 52 55 50 54 29 3b 0a 20 20 7d 65 6c 73  CORRUPT);.  }els
ce30: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
ce40: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
ce50: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
ce60: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
ce70: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
ce80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ce90: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
cea0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
ceb0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
cec0: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
ced0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
cee0: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
cef0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
cf00: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
cf10: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
cf20: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
cf30: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
cf40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
cf50: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
cf60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
cf70: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
cf80: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
cf90: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
cfa0: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
cfb0: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
cfc0: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
cfd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
cfe0: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
cff0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
d000: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
d010: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
d020: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
d030: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
d040: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
d050: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
d060: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
d070: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d080: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
d090: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
d0a0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
d0b0: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
d0c0: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
d0d0: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
d0e0: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
d100: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
d110: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
d120: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
d130: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d140: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
d150: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
d160: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
d170: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
d180: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
d190: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
d1a0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
d1b0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d1d0: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
d1e0: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
d1f0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d200: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d210: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
d220: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
d230: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
d240: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
d250: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
d260: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
d270: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
d280: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
d290: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
d2a0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
d2b0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
d2c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d2d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
d2e0: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
d2f0: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
d300: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
d310: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
d320: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
d330: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
d350: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
d360: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
d370: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
d380: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
d390: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
d3a0: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
d3b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
d3c0: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
d3e0: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
d3f0: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
d400: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
d410: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
d420: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
d430: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
d440: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
d450: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
d460: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
d470: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d480: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
d490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d4a0: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
d4b0: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
d4c0: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20  r, int level){. 
d4d0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
d4e0: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
d4f0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
d500: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
d510: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
d520: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
d530: 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
d540: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
d550: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
d560: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
d570: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
d580: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
d590: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
d5a0: 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
d5b0: 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
d5c0: 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
d5d0: 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
d5e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
d5f0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
d600: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
d610: 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  only.  .*/.int s
d620: 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
d630: 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  count = 0;../*.*
d640: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
d650: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
d660: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d670: 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a  file into zFile.
d680: 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62  ** (zFile must b
d690: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
d6a0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
d6b0: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
d6c0: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
d6d0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
d6e0: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
d6f0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
d700: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
d710: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
d720: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
d730: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
d740: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
d750: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
d760: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
d770: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
d780: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70  tic int sqlite3p
d790: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68  ager_opentemp(ch
d7a0: 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c  ar *zFile, OsFil
d7b0: 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  e **pFd){.  int 
d7c0: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
d7d0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  c;.  sqlite3_ope
d7e0: 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
d7f0: 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
d800: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
d810: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20   only */.  do{. 
d820: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
d830: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
d840: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
d850: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
d860: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
d870: 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77  e, pFd, 1);.  }w
d880: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
d890: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
d8a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
d8b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
d8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
d8d0: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
d8e0: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
d8f0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
d900: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
d910: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
d920: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
d930: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
d940: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
d950: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
d960: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
d970: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
d980: 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
d990: 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
d9a0: 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
d9b0: 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
d9c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
d9d0: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
d9e0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
d9f0: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
da00: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
da10: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
da20: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
da30: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
da40: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
da50: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
da60: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
da70: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
da80: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
da90: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
daa0: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
dab0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
dac0: 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
dad0: 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
dae0: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
daf0: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
db00: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
db10: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
db20: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
db30: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28  lite3pager_open(
db40: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
db50: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
db60: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
db70: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
db80: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
db90: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
dba0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
dbb0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
dbc0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
dbd0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
dbe0: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
dbf0: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
dc00: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
dc10: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
dc20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
dc30: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
dc40: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  this file */.){.
dc50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
dc60: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  = 0;.  char *zFu
dc70: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a  llPathname = 0;.
dc80: 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20    int nameLen;. 
dc90: 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69   OsFile *fd;.  i
dca0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dcb0: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
dcc0: 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
dcd0: 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
dce0: 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
dcf0: 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
dd00: 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
dd10: 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
dd20: 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
dd30: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
dd40: 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
dd50: 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68  ADLOCK)!=0;.  ch
dd60: 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
dd70: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
dd80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dd90: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
dda0: 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61  GEMENT.  /* A ma
ddb0: 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61  lloc() cannot fa
ddc0: 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72  il in sqlite3Thr
ddd0: 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65  eadData() as one
dde0: 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
ddf0: 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29  o .  ** malloc()
de00: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
de10: 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20  dy been made by 
de20: 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f  this thread befo
de30: 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20  re it gets.  ** 
de40: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54  to this point. T
de50: 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68  his means the Th
de60: 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61  readData must ha
de70: 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
de80: 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73  d already.  ** s
de90: 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  o that ThreadDat
dea0: 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20  a.nAlloc can be 
deb0: 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65  set. It would be
dec0: 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a   nice to assert.
ded0: 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64    ** that Thread
dee0: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e  Data.nAlloc is n
def0: 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61  on-zero, but ala
df00: 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74 65  s this breaks te
df10: 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77  st cases .  ** w
df20: 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65  ritten to invoke
df30: 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65 63   the pager direc
df40: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65  tly..  */.  Thre
df50: 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
df60: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
df70: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ();.  assert( pT
df80: 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  sd );.#endif..  
df90: 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68  /* If malloc() h
dfa0: 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65  as already faile
dfb0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
dfc0: 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76  NOMEM. Before ev
dfd0: 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20  en.  ** testing 
dfe0: 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70  for this, set *p
dff0: 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73  pPager to NULL s
e000: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f  o the caller kno
e010: 77 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  ws the pager.  *
e020: 2a 20 73 74 72 75 63 74 75 72 65 20 77 61 73 20  * structure was 
e030: 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e  never allocated.
e040: 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65   .  */.  *ppPage
e050: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  r = 0;.  if( sql
e060: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
e070: 61 64 4f 6e 6c 79 28 29 2d 3e 6d 61 6c 6c 6f 63  adOnly()->malloc
e080: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
e090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e0a0: 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
e0b0: 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  &fd, 0, sizeof(f
e0c0: 64 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  d));..  /* Open 
e0d0: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61  the pager file a
e0e0: 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68  nd set zFullPath
e0f0: 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74  name to point at
e100: 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a   malloc()ed .  *
e110: 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e  * memory contain
e120: 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ing the complete
e130: 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20   filename (i.e. 
e140: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69  including the di
e150: 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20  rectory)..  */. 
e160: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
e170: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
e180: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
e190: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
e1a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
e1b0: 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
e1c0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
e1d0: 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
e1e0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
e1f0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22   sqliteStrDup(""
e200: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
e210: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
e220: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e230: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
e240: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
e250: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
e260: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e270: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e280: 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
e290: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
e2a0: 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b  &fd, &readOnly);
e2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
e2d0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
e2e0: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
e2f0: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
e300: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
e310: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e320: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e330: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
e340: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e350: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e360: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
e370: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
e380: 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
e390: 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70   structure. As p
e3a0: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
e3b0: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f  allocation, allo
e3c0: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
e3d0: 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74  for the full pat
e3e0: 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  hs of the file, 
e3f0: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f  directory and jo
e400: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67  urnal .  ** (Pag
e410: 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61  er.zFilename, Pa
e420: 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61  ger.zDirectory a
e430: 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
e440: 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  l)..  */.  if( z
e450: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e460: 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74      nameLen = st
e470: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
e480: 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  me);.    pPager 
e490: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
e4a0: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
e4b0: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
e4c0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
e4d0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
e4e0: 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
e4f0: 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
e500: 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79   free the memory
e510: 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74   .  ** pointed t
e520: 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61  o by zFullPathna
e530: 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50 61 67  me, free the Pag
e540: 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
e550: 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a   close the .  **
e560: 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65   file. Since the
e570: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c   pager is not al
e580: 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73  located there is
e590: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20   no need to set 
e5a0: 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e  .  ** any Pager.
e5b0: 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65  errMask variable
e5c0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  s..  */.  if( !p
e5d0: 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50  Pager || !zFullP
e5e0: 61 74 68 6e 61 6d 65 20 7c 7c 20 72 63 21 3d 53  athname || rc!=S
e5f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e600: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
e610: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
e620: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e630: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
e640: 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
e650: 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c  return ((rc==SQL
e660: 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e  ITE_OK)?SQLITE_N
e670: 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20  OMEM:rc);.  }.. 
e680: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64   TRACE3("OPEN %d
e690: 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
e6a0: 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
e6b0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
e6c0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
e6d0: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
e6e0: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
e6f0: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
e700: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
e710: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
e720: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
e730: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e740: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
e750: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
e760: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
e770: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
e780: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
e790: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
e7a0: 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  name);..  for(i=
e7b0: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
e7c0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e7d0: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
e7e0: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
e7f0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e800: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
e810: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
e820: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
e830: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
e840: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
e850: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
e860: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e870: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
e880: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
e890: 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20  ->fd = fd;.  /* 
e8a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e8b0: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
e8c0: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
e8d0: 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
e8e0: 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
e8f0: 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
e900: 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
e910: 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
e920: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
e930: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
e940: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
e950: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
e960: 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
e970: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
e980: 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
e990: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
e9a0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
e9b0: 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70  AGE_SIZE;.  /* p
e9c0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
e9d0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
e9e0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
e9f0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
ea00: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
ea10: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
ea20: 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  MaxPage = 0; */.
ea30: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
ea40: 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74   = 100;.  assert
ea50: 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d  ( PAGER_UNLOCK==
ea60: 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  0 );.  /* pPager
ea70: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
ea80: 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
ea90: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
eaa0: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
eab0: 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d  ->tempFile = tem
eac0: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
ead0: 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
eae0: 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
eaf0: 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
eb00: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
eb10: 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
eb20: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
eb30: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
eb40: 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
eb50: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
eb60: 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
eb70: 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a  oSync?0:1);.  /*
eb80: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
eb90: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
eba0: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
ebb0: 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
ebc0: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
ebd0: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
ebe0: 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
ebf0: 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
ec00: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  .  pPager->secto
ec10: 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45  rSize = PAGER_SE
ec20: 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  CTOR_SIZE;.  /* 
ec30: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
ec40: 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
ec50: 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
ec60: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
ec70: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
ec80: 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
ec90: 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65   = pPager;.#ifde
eca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ecb0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
ecc0: 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  T.  pPager->pNex
ecd0: 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72  t = pTsd->pPager
ece0: 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72  ;.  pTsd->pPager
ecf0: 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69   = pPager;.#endi
ed00: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
ed10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
ed20: 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
ed30: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
ed40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
ed50: 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c  er_set_busyhandl
ed60: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
ed70: 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
ed80: 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
ed90: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
eda0: 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
edb0: 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
edc0: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
edd0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
ede0: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
edf0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
ee00: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
ee10: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
ee20: 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
ee30: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
ee40: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
ee50: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
ee60: 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
ee70: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
ee80: 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
ee90: 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
eea0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
eeb0: 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
eec0: 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
eed0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
eee0: 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
eef0: 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
ef00: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
ef10: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
ef20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ef30: 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75  pager_set_destru
ef40: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
ef50: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
ef60: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20  )(void*,int)){. 
ef70: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
ef80: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
ef90: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
efa0: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
efb0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
efc0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
efd0: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
efe0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
eff0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
f000: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
f010: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
f020: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
f030: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
f040: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
f050: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
f060: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
f070: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
f080: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
f090: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
f0a0: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
f0b0: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
f0c0: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
f0d0: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
f0e0: 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61  _set_reiniter(Pa
f0f0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
f100: 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69  d (*xReinit)(voi
f110: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
f120: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
f130: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
f140: 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
f150: 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ize.  Return the
f160: 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74   new size.  If t
f170: 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
f180: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69  age.** size is i
f190: 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
f1a0: 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
f1b0: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
f1c0: 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72  elected.** and r
f1d0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
f1e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
f1f0: 5f 70 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  _pagesize(Pager 
f200: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67  *pPager, int pag
f210: 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  eSize){.  assert
f220: 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
f230: 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
f240: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
f250: 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  E );.  if( !pPag
f260: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
f270: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f280: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
f290: 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
f2a0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  r->pageSize;.}..
f2b0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
f2c0: 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
f2d0: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
f2e0: 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
f2f0: 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
f300: 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
f310: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
f320: 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
f330: 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
f340: 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
f350: 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
f360: 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
f370: 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
f380: 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
f390: 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
f3a0: 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
f3b0: 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
f3c0: 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
f3d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f3e0: 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
f3f0: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f400: 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
f410: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
f420: 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
f430: 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
f440: 76 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d 75 6c  void clear_simul
f450: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 7b  ated_io_error(){
f460: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
f470: 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 76  ror_hit = 0;.}.v
f480: 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
f490: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
f4a0: 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
f4b0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
f4c0: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
f4d0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
f4e0: 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
f4f0: 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
f500: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f510: 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
f520: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
f530: 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
f540: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
f550: 65 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65  e clear_simulate
f560: 64 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20 64  d_io_error().# d
f570: 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
f580: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f590: 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
f5a0: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f5b0: 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
f5c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
f5d0: 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
f5e0: 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
f5f0: 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
f600: 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
f610: 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
f620: 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72  o. .**.** No err
f630: 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  or checking is d
f640: 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  one. The rationa
f650: 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  l for this is th
f660: 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
f670: 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c   .** may be call
f680: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  ed even if the f
f690: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
f6a0: 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20  st or contain a 
f6b0: 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74  header. In .** t
f6c0: 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74  hese cases sqlit
f6d0: 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20  e3OsRead() will 
f6e0: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c  return an error,
f6f0: 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f   to which the co
f700: 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e  rrect .** respon
f710: 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68  se is to zero th
f720: 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73  e memory at pDes
f730: 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20  t and continue. 
f740: 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72   A real IO error
f750: 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d   .** will presum
f760: 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62  ably recur and b
f770: 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65  e picked up late
f780: 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61  r (Todo: Think a
f790: 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 76  bout this)..*/.v
f7a0: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
f7b0: 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72  _read_fileheader
f7c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
f7d0: 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
f7e0: 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
f7f0: 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
f800: 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42   N);.  if( MEMDB
f810: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
f820: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
f830: 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >fd, 0);.    sql
f840: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
f850: 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29  r->fd, pDest, N)
f860: 3b 0a 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75  ;.    clear_simu
f870: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29  lated_io_error()
f880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
f890: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
f8a0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
f8b0: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
f8c0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f8d0: 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
f8e0: 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
f8f0: 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
f900: 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
f910: 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
f920: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
f930: 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
f940: 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
f950: 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
f960: 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
f970: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
f980: 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
f990: 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
f9a0: 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
f9b0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
f9c0: 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
f9d0: 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
f9e0: 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
f9f0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
fa00: 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  pagecount(Pager 
fa10: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
fa20: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
fa30: 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
fa40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
fa50: 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  0 ){.    n = pPa
fa60: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
fa70: 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20   else {.    if( 
fa80: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
fa90: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
faa0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
fab0: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
fac0: 72 28 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  r(pPager, SQLITE
fad0: 5f 49 4f 45 52 52 29 3b 0a 20 20 20 20 20 20 72  _IOERR);.      r
fae0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
faf0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
fb00: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
fb10: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b   ){.      n = 1;
fb20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fb30: 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70    n /= pPager->p
fb40: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ageSize;.    }. 
fb50: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
fb60: 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
fb70: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
fb80: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a  er->dbSize = n;.
fb90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
fba0: 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  n==(PENDING_BYTE
fbb0: 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
fbc0: 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20  e) ){.    n++;. 
fbd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
fbe0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
fbf0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
fc00: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
fc10: 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
fc20: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
fc30: 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
fc40: 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
fc50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
fc60: 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
fc70: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
fc80: 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
fc90: 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
fca0: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
fcb0: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
fcc0: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  * sqlite3pager_m
fcd0: 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
fce0: 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
fcf0: 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
fd00: 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
fd10: 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
fd20: 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
fd30: 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
fd40: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
fd50: 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
fd60: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
fd70: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
fd80: 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
fd90: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
fda0: 20 6e 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c   number is zero,
fdb0: 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
fdc0: 69 73 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61  is not in any ha
fdd0: 73 68 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20  sh chain. */.   
fde0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
fdf0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
fe00: 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
fe10: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
fe20: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
fe30: 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
fe40: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
fe50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fe60: 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72  ger->aHash[pager
fe70: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
fe80: 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
fe90: 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
fea0: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
feb0: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
fec0: 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
fed0: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
fee0: 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
fef0: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
ff00: 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  h]==pPg );.    p
ff10: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
ff20: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
ff30: 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67  ;.  }..  pPg->pg
ff40: 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
ff50: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
ff60: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
ff70: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
ff80: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
ff90: 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
ffa0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
ffb0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
ffc0: 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
ffd0: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
ffe0: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
fff0: 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
10000 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
10010 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
10020 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
10030 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74   Keep the pFirst
10040 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70  Synced pointer p
10050 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66  ointing at the f
10060 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65  irst synchronize
10070 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  d page */.  if( 
10080 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  pPg==pPager->pFi
10090 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
100a0 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
100b0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
100c0 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
100d0 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
100e0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
100f0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
10100 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
10110 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
10120 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
10130 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  */.  if( pPg->pP
10140 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70  revFree ){.    p
10150 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
10160 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
10170 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c  pNextFree;.  }el
10180 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
10190 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
101a0 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
101b0 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
101c0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a  >pNextFree;.  }.
101d0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
101e0 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
101f0 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
10200 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
10210 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  evFree;.  }else{
10220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
10230 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20  ger->pLast==pPg 
10240 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
10250 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
10260 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67  vFree;.  }.  pPg
10270 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
10280 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30  g->pPrevFree = 0
10290 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
102a0 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73  rom the pgno has
102b0 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c  h table */.  unl
102c0 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
102d0 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69  ger, pPg);.}..#i
102e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
102f0 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
10300 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10310 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
10320 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
10330 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65  atabase.  Delete
10340 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68  .** all pages wh
10350 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ose pgno is larg
10360 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
10370 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
10380 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52  referenced..** R
10390 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
103a0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
103b0 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
103c0 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eroed..*/.static
103d0 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e   void memoryTrun
103e0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
103f0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
10400 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
10410 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
10420 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
10430 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61  ;..  ppPg = &pPa
10440 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69  ger->pAll;.  whi
10450 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67  le( (pPg = *ppPg
10460 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
10470 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a  pPg->pgno<=dbSiz
10480 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20  e ){.      ppPg 
10490 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
104a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
104b0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  pPg->nRef>0 ){. 
104c0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
104d0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
104e0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
104f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67  ize);.      ppPg
10500 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
10510 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
10520 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d      *ppPg = pPg-
10530 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
10540 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
10550 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
10560 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
10570 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
10580 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
10590 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79  e.#define memory
105a0 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64  Truncate(p).#end
105b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  if../*.** Try to
105c0 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
105d0 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
105e0 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
105f0 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
10600 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
10610 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
10620 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
10630 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
10640 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
10650 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
10660 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
10670 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10680 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
10690 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
106a0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
106b0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
106c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
106d0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
106e0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
106f0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
10700 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10710 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
10720 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
10730 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10740 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
10750 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
10760 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
10770 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
10780 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
10790 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
107a0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
107b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
107c0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
107d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
107e0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
107f0 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
10800 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
10810 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
10820 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
10830 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
10840 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
10850 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10870 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
10880 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a  locktype;.    }.
10890 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
108a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
108b0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
108c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
108d0 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
108e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
108f0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
10900 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
10910 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
10920 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
10930 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
10940 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10950 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
10960 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
10970 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
10980 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
10990 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
109a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
109b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
109c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
109d0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
109e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
109f0 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
10a00 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
10a10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
10a30 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
10a40 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
10a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10a60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10a70 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
10a80 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
10a90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
10aa0 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
10ab0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
10ac0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
10ad0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
10ae0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
10af0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10b00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10b10 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
10b20 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
10b30 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   nPage);.  if( r
10b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10b50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10b60 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ze = nPage;.  }.
10b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10b80 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
10b90 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
10ba0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
10bb0 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
10bc0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
10bd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
10be0 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
10bf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10c00 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
10c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10c20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
10c30 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
10c40 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
10c50 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
10c60 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
10c70 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
10c80 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
10c90 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
10ca0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
10cb0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
10cc0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
10cd0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
10ce0 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
10cf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
10d00 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
10d10 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
10d20 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
10d30 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
10d40 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
10d50 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
10d60 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
10d70 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
10d80 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
10d90 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
10da0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
10db0 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
10dc0 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
10dd0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
10de0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
10df0 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
10e00 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
10e10 2c 20 2a 70 4e 65 78 74 3b 0a 23 69 66 64 65 66  , *pNext;.#ifdef
10e20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
10e30 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
10e40 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
10e50 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
10e60 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
10e70 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
10e80 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
10e90 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
10ea0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
10eb0 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
10ec0 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
10ed0 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
10ee0 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
10ef0 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
10f00 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
10f10 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
10f20 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
10f30 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
10f40 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20  oc can be set.. 
10f50 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
10f60 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
10f70 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
10f80 61 73 73 65 72 74 28 20 70 54 73 64 20 26 26 20  assert( pTsd && 
10f90 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  pTsd->nAlloc );.
10fa0 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
10fb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
10fc0 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
10fd0 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20  R_RESERVED:.    
10fe0 63 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45  case PAGER_SYNCE
10ff0 44 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41 47  D: .    case PAG
11000 45 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a  ER_EXCLUSIVE: {.
11010 20 20 20 20 20 20 2f 2a 20 57 65 20 69 67 6e 6f        /* We igno
11020 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 73  re any IO errors
11030 20 74 68 61 74 20 6f 63 63 75 72 20 64 75 72 69   that occur duri
11040 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a  ng the rollback.
11050 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69        ** operati
11060 6f 6e 2e 20 53 6f 20 64 69 73 61 62 6c 65 20 49  on. So disable I
11070 4f 20 65 72 72 6f 72 20 73 69 6d 75 6c 61 74 69  O error simulati
11080 6f 6e 20 73 6f 20 74 68 61 74 20 74 65 73 74 69  on so that testi
11090 6e 67 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 6b  ng.      ** work
110a0 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 2e 0a 20  s more easily.. 
110b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 69       */.      di
110c0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
110d0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
110e0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
110f0 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
11100 3b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 5f 73  ;.      enable_s
11110 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
11120 72 73 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rs();.      if( 
11130 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
11140 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
11150 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
11160 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
11170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11180 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
11190 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
111a0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Open==0 );.     
111b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
111c0 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41    case PAGER_SHA
111d0 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  RED: {.      if(
111e0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
111f0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
11200 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
11210 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
11220 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11230 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
11240 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
11250 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
11260 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
11270 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
11280 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
11290 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65  g=pNext){.#ifnde
112a0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28  f NDEBUG.    if(
112b0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
112c0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
112d0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
112e0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
112f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
11300 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
11310 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
11320 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
11330 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11340 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
11350 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
11360 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
11370 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
11380 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
11390 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c    }.  TRACE2("CL
113a0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
113b0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61  ID(pPager));.  a
113c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
113d0 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65  rrCode || (pPage
113e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
113f0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d  0 && pPager->stm
11400 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  tOpen==0) );.  i
11410 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
11420 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
11430 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
11440 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
11450 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
11460 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
11470 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11480 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
11490 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
114a0 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
114b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c   }.  sqlite3OsCl
114c0 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ose(&pPager->fd)
114d0 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
114e0 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
114f0 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
11500 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
11510 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
11520 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
11530 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
11540 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
11550 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65  ** }.  */..#ifde
11560 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11570 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
11580 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  T.  /* Remove th
11590 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65  e pager from the
115a0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
115b0 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20  pagers starting 
115c0 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44  at .  ** ThreadD
115d0 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65  ata.pPager if me
115e0 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
115f0 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f  is enabled..  */
11600 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70  .  if( pPager==p
11610 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  Tsd->pPager ){. 
11620 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20     pTsd->pPager 
11630 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
11640 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61  .  }else{.    Pa
11650 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66  ger *pTmp;.    f
11660 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e  or(pTmp = pTsd->
11670 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e  pPager; pTmp->pN
11680 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d  ext!=pPager; pTm
11690 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 3b 0a  p=pTmp->pNext);.
116a0 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20      pTmp->pNext 
116b0 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
116c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
116d0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
116e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
116f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11700 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
11710 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
11720 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
11730 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70  */.Pgno sqlite3p
11740 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28  ager_pagenumber(
11750 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
11760 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f  PgHdr *p = DATA_
11770 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
11780 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
11790 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
117a0 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
117b0 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
117c0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
117d0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
117e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
117f0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
11800 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
11810 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
11820 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
11830 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
11840 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
11850 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
11860 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
11870 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
11880 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
11890 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
118a0 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
118b0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
118c0 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
118d0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
118e0 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
118f0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
11900 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
11910 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
11920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11930 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
11940 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
11950 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
11960 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
11970 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
11980 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
11990 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
119a0 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
119b0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
119c0 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
119d0 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
119e0 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
119f0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
11a00 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
11a10 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
11a20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
11a30 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
11a40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
11a50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
11a60 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
11a70 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
11a80 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
11a90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11aa0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
11ab0 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
11ac0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
11ad0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
11ae0 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
11af0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
11b00 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
11b10 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
11b20 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
11b30 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
11b40 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
11b50 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
11b60 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
11b70 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
11b80 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
11b90 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
11ba0 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
11bb0 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
11bc0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
11bd0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
11be0 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
11bf0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
11c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
11c10 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
11c20 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
11c30 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
11c40 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
11c50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
11c60 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
11c70 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
11c80 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
11c90 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
11ca0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
11cb0 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
11cc0 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
11cd0 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
11ce0 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
11cf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
11d00 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70  ager_ref(void *p
11d10 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
11d20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
11d30 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61  HDR(pData);.  pa
11d40 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
11d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
11d70 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
11d80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
11d90 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
11da0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
11db0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
11dc0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
11dd0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
11de0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
11df0 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
11e00 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
11e10 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
11e20 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
11e30 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
11e40 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
11e50 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
11e60 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
11e70 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
11e80 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
11e90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
11ea0 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
11eb0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
11ec0 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
11ed0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
11ee0 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
11ef0 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
11f00 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
11f10 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
11f20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
11f30 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
11f40 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
11f50 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
11f60 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
11f70 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
11f80 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
11f90 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
11fa0 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
11fb0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
11fc0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
11fd0 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
11fe0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
11ff0 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
12000 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
12010 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
12020 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
12030 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
12040 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
12050 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
12060 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
12070 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
12080 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
12090 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
120a0 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
120b0 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
120c0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
120d0 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
120e0 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79  r failure, so sy
120f0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
12100 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
12110 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
12120 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
12130 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
12140 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
12150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12160 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
12170 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
12180 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
12190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
121a0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
121b0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64  urnal before mod
121c0 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ifying the main 
121d0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61  database.  ** (a
121e0 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73  ssuming there is
121f0 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69   a journal and i
12200 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  t needs to be sy
12210 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  nced.).  */.  if
12220 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
12230 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  nc ){.    if( !p
12240 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
12250 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12260 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12270 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  Open );.      /*
12280 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
12290 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e  ->noSync ); // n
122a0 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73  oSync might be s
122b0 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  et if synchronou
122c0 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  s.      ** was t
122d0 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20  urned off after 
122e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
122f0 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69  was started.  Ti
12300 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66  cket #615 */.#if
12310 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
12320 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    {.        /* M
12330 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61  ake sure the pPa
12340 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65  ger->nRec counte
12350 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67  r we are keeping
12360 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20   agrees.        
12370 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  ** with the nRec
12380 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
12390 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
123a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
123b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
123c0 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20  i64 jSz;.       
123d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
123e0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
123f0 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
12400 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
12410 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12420 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12430 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
12440 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Sz );.      }.#e
12450 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
12460 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
12470 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
12480 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
12490 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
124a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
124b0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
124c0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
124d0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
124e0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
124f0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
12500 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
12510 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
12520 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
12530 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
12540 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
12550 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
12560 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  k. .        */. 
12570 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
12580 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
12590 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28           TRACE2(
125a0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
125b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
125c0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
125d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
125e0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
125f0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
12600 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
12620 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
12630 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
12640 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
12670 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
12680 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
12690 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
126a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
126b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
126c0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
126d0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
126e0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
126f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12700 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12710 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
12720 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12730 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
12740 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
12750 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12760 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
12770 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
12780 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
12790 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72  Pager));.      r
127a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
127b0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
127c0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29  Pager->fullSync)
127d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
127e0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
127f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
12800 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
12810 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
12820 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
12830 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
12840 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
12850 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
12860 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
12870 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
12880 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
12890 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
128a0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
128b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
128c0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
128d0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
128e0 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
128f0 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
12900 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
12910 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
12920 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
12930 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
12940 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
12950 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
12960 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
12970 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
12980 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
12990 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
129a0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
129b0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
129c0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
129d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
129e0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
129f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
12a00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
12a10 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
12a20 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
12a30 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
12a40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
12a50 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
12a60 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
12a70 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
12a80 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
12a90 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
12aa0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
12ab0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
12ac0 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
12ad0 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
12ae0 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
12af0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
12b00 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
12b10 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
12b20 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
12b30 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
12b40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
12b50 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
12b60 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
12b70 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
12b80 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
12b90 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
12ba0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
12bb0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
12bc0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
12bd0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
12be0 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
12bf0 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
12c00 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
12c10 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
12c20 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
12c30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
12c40 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
12c50 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
12c60 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
12c70 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
12c80 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
12c90 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
12ca0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
12cb0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
12cc0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
12cd0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
12ce0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
12cf0 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
12d00 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
12d10 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
12d20 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
12d30 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
12d40 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
12d50 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
12d60 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
12d70 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
12d80 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
12d90 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
12da0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
12db0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
12dc0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
12dd0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
12de0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
12df0 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
12e00 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
12e10 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
12e20 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
12e30 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
12e40 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
12e50 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
12e60 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
12e70 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
12e80 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
12e90 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
12ea0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
12eb0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
12ec0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
12ed0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
12ee0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
12ef0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
12f00 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
12f10 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
12f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12f30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12f40 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69   }..  while( pLi
12f50 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
12f60 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
12f70 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12f80 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
12f90 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
12fa0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
12fb0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
12fc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
12fd0 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74   rc;.    /* If t
12fe0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
12ff0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
13000 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
13010 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
13020 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
13030 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
13040 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67  means sqlite3pag
13050 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61  er_truncate() wa
13060 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
13070 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
13080 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
13090 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
130a0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
130b0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
130c0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
130d0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
130e0 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
130f0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
13100 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43  bSize ){.      C
13110 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
13120 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
13130 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
13140 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
13150 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
13160 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13170 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
13180 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  gno);.      rc =
13190 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
131a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
131b0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
131c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
131e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
131f0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
13200 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
13210 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
13220 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  t->pgno, 0);.   
13230 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
13240 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
13250 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
13260 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
13270 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f     TRACE3("NOSTO
13280 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
13290 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
132a0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
132b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
132c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
132d0 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
132e0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
132f0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
13300 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
13310 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
13320 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
13330 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
13340 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
13350 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
13360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13370 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
13380 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
13390 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
133a0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
133b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
133c0 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
133d0 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
133e0 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
133f0 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
13400 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
13410 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
13420 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
13430 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
13440 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
13450 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
13460 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
13470 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
13480 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
13490 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
134a0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
134b0 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
134c0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
134d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
134e0 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
134f0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
13500 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
13510 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
13520 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
13530 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
13540 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
13550 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
13560 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13570 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
13580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13590 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
135a0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
135b0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
135c0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
135d0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
135e0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
135f0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
13600 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
13610 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
13620 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
13630 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
13640 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13650 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
13660 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
13670 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
13680 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
13690 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
136a0 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30  rnal) ) return 0
136b0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  ;.  if( sqlite3O
136c0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
136d0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
136e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
136f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
13700 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
13710 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13720 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13730 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
13740 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
13750 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
13760 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
13770 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
13780 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
13790 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
137a0 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
137b0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
137c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
137d0 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
137e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
137f0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
13800 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
13810 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
13820 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13830 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
13840 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
13850 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
13860 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
13870 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
13880 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
13890 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
138a0 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
138b0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
138c0 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
138d0 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
138e0 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
138f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
13900 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
13910 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
13920 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
13930 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
13940 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
13950 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
13960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13970 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
13980 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
13990 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
139a0 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
139b0 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
139c0 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
139d0 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
139e0 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
139f0 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
13a00 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
13a10 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
13a20 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
13a30 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
13a40 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
13a50 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
13a60 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13a70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13a80 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
13a90 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
13aa0 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
13ab0 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
13ac0 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
13ad0 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
13ae0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
13af0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
13b00 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
13b10 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
13b20 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
13b30 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
13b40 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
13b50 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
13b60 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
13b70 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
13b80 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
13b90 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
13ba0 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
13bb0 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
13bc0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
13bd0 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
13be0 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
13bf0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
13c00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13c10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
13c20 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
13c30 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
13c40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
13c50 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
13c60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13c80 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
13c90 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
13ca0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
13cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13cc0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
13cd0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
13ce0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
13cf0 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
13d00 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
13d10 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
13d20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
13d30 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
13d40 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
13d50 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
13d60 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
13d70 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
13d80 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
13d90 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66  t( pPg );.    if
13da0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13db0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13dc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
13dd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
13de0 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
13df0 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
13e00 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
13e10 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
13e20 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
13e30 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
13e40 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
13e50 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
13e60 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
13e70 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  qlite_dont_rollb
13e80 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
13e90 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
13ea0 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
13eb0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
13ec0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
13ed0 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
13ee0 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
13ef0 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
13f00 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
13f10 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
13f20 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
13f30 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
13f40 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
13f50 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
13f60 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
13f70 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13f80 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
13f90 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
13fa0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
13fb0 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
13fc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
13fd0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
13fe0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
13ff0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
14000 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   1;.  }..  /* Un
14010 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
14020 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
14030 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
14040 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75  h table.  */.  u
14050 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
14060 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
14070 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a  er->nOvfl);..  *
14080 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
14090 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
140a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
140b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
140c0 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
140d0 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
140e0 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
140f0 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
14100 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
14110 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
14120 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
14130 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
14140 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
14150 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
14160 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  eFree()ed..**.**
14170 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
14180 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
14190 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
141a0 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
141b0 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
141c0 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
141d0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65  on returns. A ne
141e0 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72  gative value for
141f0 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66   nReq means.** f
14200 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
14210 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20  ry as possible. 
14220 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
14230 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
14240 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
14250 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
14260 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ased..*/.#ifdef 
14270 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
14280 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
14290 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
142a0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
142b0 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e  int nReq){.  con
142c0 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  st ThreadData *p
142d0 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54  Tsdro = sqlite3T
142e0 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c  hreadDataReadOnl
142f0 79 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b  y();.  Pager *p;
14300 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
14310 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a   = 0;.  int i;..
14320 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20    /* If the the 
14330 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
14340 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f  held, this subro
14350 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a  utine becomes a.
14360 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20    ** o-op; zero 
14370 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
14380 61 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73  are freed.  This
14390 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a   is because.  **
143a0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64   some of the cod
143b0 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69  e invoked by thi
143c0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
143d0 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20  lso.  ** try to 
143e0 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78  obtain the mutex
143f0 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  , resulting in a
14400 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   deadlock..  */.
14410 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49    if( sqlite3OsI
14420 6e 4d 75 74 65 78 28 29 20 29 7b 0a 20 20 20 20  nMutex() ){.    
14430 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
14440 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f   /* Outermost lo
14450 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d  op runs for at m
14460 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f  ost two iteratio
14470 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74  ns. First iterat
14480 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20  ion we.  ** try 
14490 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74  to find memory t
144a0 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  hat can be relea
144b0 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  sed without call
144c0 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63  ing fsync(). Sec
144d0 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69  ond.  ** iterati
144e0 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72  on (which only r
144f0 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74  uns if the first
14500 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20   failed to free 
14510 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20  nReq bytes of.  
14520 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65  ** memory) is pe
14530 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20  rmitted to call 
14540 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73  fsync(). This is
14550 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20   of course much 
14560 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e  more .  ** expen
14570 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sive..  */.  for
14580 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29  (i=0; i<=1; i++)
14590 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  {..    /* Loop t
145a0 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53  hrough all the S
145b0 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65  QLite pagers ope
145c0 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
145d0 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  nt thread. */.  
145e0 20 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e    for(p=pTsdro->
145f0 70 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52  pPager; p && (nR
14600 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
14610 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e  d<nReq); p=p->pN
14620 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
14630 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
14640 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t rc;..      /* 
14650 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
14660 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
14670 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
14680 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
14690 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
146a0 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
146b0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
146c0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
146d0 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
146e0 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
146f0 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
14700 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
14710 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
14720 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70  , i, &pPg)) && p
14730 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pg) {.        /*
14740 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
14750 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
14760 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
14770 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
14780 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
14790 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
147a0 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
147b0 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
147c0 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  list .        **
147d0 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
147e0 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
147f0 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
14800 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
14810 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
14820 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
14830 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
14840 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
14850 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
14860 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
14870 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
14880 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
14890 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  It .        ** p
148a0 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
148b0 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  h..        */.  
148c0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
148d0 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
148e0 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
148f0 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
14900 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
14910 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14920 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pg==p->pAll ){. 
14930 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c            p->pAl
14940 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
14950 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
14960 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
14970 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70   pTmp=p->pAll; p
14980 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
14990 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
149a0 4e 65 78 74 41 6c 6c 20 29 3b 0a 20 20 20 20 20  NextAll );.     
149b0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
149c0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
149d0 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
149e0 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
149f0 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
14a00 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
14a10 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
14a20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
14a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
14a50 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
14a60 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
14a70 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
14a80 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
14a90 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
14aa0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
14ab0 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
14ac0 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
14ad0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
14ae0 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
14af0 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
14b00 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
14b10 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
14b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
14b30 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
14b40 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
14b50 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
14b60 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
14b70 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
14b80 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
14b90 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
14ba0 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
14bb0 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
14bc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14bd0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  rt( rc==SQLITE_I
14be0 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OERR || rc==SQLI
14bf0 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TE_FULL );.     
14c00 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74     assert( p->st
14c10 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
14c20 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70  VED );.        p
14c30 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63  ager_error(p, rc
14c40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14c50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
14c60 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
14c70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
14c80 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
14c90 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
14ca0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
14cb0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
14cc0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
14cd0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
14ce0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
14cf0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
14d00 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
14d10 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
14d20 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
14d30 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
14d40 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
14d50 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
14d60 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
14d70 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
14d80 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
14d90 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
14da0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
14db0 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
14dc0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
14dd0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
14de0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
14df0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
14e00 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
14e10 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
14e20 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
14e30 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
14e40 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
14e50 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
14e60 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
14e70 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
14e80 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
14e90 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
14ea0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
14eb0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
14ec0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
14ed0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
14ee0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14ef0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
14f00 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
14f10 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
14f20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
14f30 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
14f40 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
14f50 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
14f60 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
14f70 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
14f80 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
14f90 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
14fa0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
14fb0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
14fc0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
14fd0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
14fe0 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
14ff0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
15000 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
15010 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
15020 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
15030 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
15040 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
15050 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
15060 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
15070 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
15080 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
15090 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
150a0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
150b0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
150c0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
150d0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
150e0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
150f0 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
15100 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
15110 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
15120 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
15130 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
15140 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
15150 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
15160 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
15170 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
15180 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
15190 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
151a0 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
151b0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
151c0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
151d0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
151e0 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
151f0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
15200 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
15210 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
15220 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
15230 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
15240 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
15250 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
15260 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
15270 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
15280 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  ppPage = 0;.  if
15290 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
152a0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
152b0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
152c0 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
152d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
152e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
152f0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
15300 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
15310 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
15320 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
15330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15340 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
15350 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
15360 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28  MEMDB ){.    if(
15370 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
15380 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
15390 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
153a0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
153b0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
153c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
153d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
153e0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
153f0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
15400 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
15410 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
15420 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
15430 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
15440 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
15450 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
15460 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
15470 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
15480 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
15490 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
154a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48   */.    if( hasH
154b0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
154c0 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20  ) ){.       int 
154d0 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47  rc;..       /* G
154e0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
154f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15500 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
15510 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
15520 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
15530 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
15540 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
15550 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
15560 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
15570 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
15580 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
15590 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
155a0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
155b0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
155c0 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
155d0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
155e0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
155f0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a  hat the.       *
15600 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
15610 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
15620 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
15630 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69   still rolling i
15640 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63  t .       ** bac
15650 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  k..       ** .  
15660 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
15670 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
15680 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
15690 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
156a0 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73   the.       ** s
156b0 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
156c0 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
156d0 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
156e0 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
156f0 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
15700 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
15710 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15720 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
15730 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
15740 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
15750 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
15760 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
15770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15790 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
157a0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
157b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
157c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
157d0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
157e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
157f0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
15800 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d  r, rc);.       }
15810 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
15820 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
15830 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20  CLUSIVE;..      
15840 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
15850 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67  rnal for reading
15860 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53   only.  Return S
15870 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20  QLITE_BUSY if.  
15880 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
15890 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
158a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
158b0 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  .       **.     
158c0 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
158d0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
158e0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
158f0 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
15900 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
15910 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
15920 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
15930 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
15940 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a   holds.       **
15950 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
15960 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
15970 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
15980 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
15990 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
159a0 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
159b0 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
159c0 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ime..       */. 
159d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
159e0 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
159f0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
15a00 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  l, &pPager->jfd)
15a10 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
15a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
15a40 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
15a50 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
15a60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
15a70 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
15a80 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
15a90 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
15aa0 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
15ab0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15ac0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
15ad0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15ae0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
15af0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
15b00 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
15b10 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
15b20 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
15b30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15b40 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Hdr = 0;..      
15b50 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
15b60 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
15b70 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
15b80 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
15b90 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
15ba0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
15bb0 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
15bc0 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
15bd0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
15be0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69  Pager);.       i
15bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
15c10 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
15c20 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
15c30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15c40 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
15c50 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
15c60 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
15c70 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
15c80 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
15c90 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  er, pgno);.    i
15ca0 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
15cb0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
15cc0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
15cd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
15ce0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
15cf0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
15d00 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
15d10 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
15d20 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
15d30 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
15d40 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54      int h;.    T
15d50 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
15d60 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28  >nMiss);.    if(
15d70 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
15d80 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
15d90 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
15da0 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20  =0 || MEMDB ){. 
15db0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
15dc0 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20   new page */.   
15dd0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d     pPg = sqliteM
15de0 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
15df0 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
15e00 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
15e30 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
15e40 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
15e70 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
15e80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
15e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
15ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15eb0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
15ec0 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
15ed0 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
15ee0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
15ef0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
15f00 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
15f10 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
15f20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
15f30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
15f40 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
15f50 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
15f60 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
15f70 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
15f80 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
15f90 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
15fa0 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
15fb0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
15fc0 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61  Page>pPager->nMa
15fd0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
15fe0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15ff0 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67  >nMaxPage==(pPag
16000 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a  er->nPage-1) );.
16010 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16020 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20  nMaxPage++;.    
16030 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
16040 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
16050 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20  recycle(pPager, 
16060 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  1, &pPg);.      
16070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16080 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
16090 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
160a0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
160b0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
160c0 74 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a 20  t(pPg) ;.    }. 
160d0 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
160e0 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61  gno;.    if( pPa
160f0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
16100 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
16110 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
16120 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16130 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61  3CheckMemory(pPa
16140 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->aInJournal,
16150 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20   pgno/8);.      
16160 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16170 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
16180 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
16190 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
161a0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
161b0 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
161c0 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
161d0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
161e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
161f0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
16200 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
16210 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
16220 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
16230 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28  er->aInStmt && (
16240 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
16250 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20  ->stmtSize.     
16260 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67          && (pPag
16270 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f  er->aInStmt[pgno
16280 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
16290 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  7)))!=0 ){.     
162a0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
162b0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
162c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61   }else{.      pa
162d0 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73  ge_remove_from_s
162e0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
162f0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69     }.    pPg->di
16300 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  rty = 0;.    pPg
16310 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
16320 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20  REFINFO(pPg);.  
16330 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
16340 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f  ;.    h = pager_
16350 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20  hash(pgno);.    
16360 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
16370 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
16380 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
16390 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
163a0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
163b0 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
163c0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
163d0 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
163e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
163f0 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
16400 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
16410 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
16420 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
16430 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
16440 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
16450 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
16460 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
16470 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
16480 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
16490 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
164a0 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
164b0 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
164c0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
164d0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72  errCode;.      r
164e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
164f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 70      if( sqlite3p
16500 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
16510 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f  Pager)<(int)pgno
16520 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
16530 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
16540 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
16550 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
16560 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
16570 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
16580 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
16590 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
165a0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
165b0 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
165c0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
165d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
165e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
165f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16600 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
16610 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
16620 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20  ATA(pPg),.      
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16640 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16650 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16660 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28   }.      TRACE3(
16670 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
16680 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
16690 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
166a0 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
166b0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
166c0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
166d0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
166e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
166f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  K ){.        i64
16700 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20   fileSize;.     
16710 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
16720 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
16730 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d  >fd,&fileSize)!=
16740 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
16750 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65           || file
16760 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65  Size>=pgno*pPage
16770 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
16780 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16790 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
167a0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
167b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
167c0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
167d0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
167e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
167f0 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61      clear_simula
16800 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a  ted_io_error();.
16810 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
16820 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
16830 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
16840 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16850 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16860 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49  {.        TEST_I
16870 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
16880 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
16890 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
168a0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
168b0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
168c0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
168d0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
168e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
168f0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
16900 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
16910 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54  che. */.    TEST
16920 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
16930 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  it);.    page_re
16940 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
16950 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
16960 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
16970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16980 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
16990 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
169a0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
169b0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
169c0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
169d0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
169e0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
169f0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
16a00 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
16a10 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
16a20 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
16a30 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
16a40 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
16a50 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16a60 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
16a70 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70  .** and sqlite3p
16a80 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
16a90 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
16aa0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
16ab0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
16ac0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
16ad0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
16ae0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
16af0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
16b00 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
16b10 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
16b20 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
16b30 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
16b40 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
16b50 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
16b60 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
16b70 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16b80 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
16b90 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
16ba0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
16bb0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
16bc0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
16bd0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
16be0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
16bf0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
16c00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16c10 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
16c20 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
16c30 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
16c40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16c50 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
16c60 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
16c70 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
16c80 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
16c90 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
16ca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
16cb0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
16cc0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
16cd0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
16ce0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
16cf0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
16d00 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
16d10 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
16d20 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
16d30 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
16d40 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
16d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16d60 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
16d70 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
16d80 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
16d90 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
16da0 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
16db0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
16dc0 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
16dd0 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
16de0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
16df0 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
16e00 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
16e10 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
16e20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
16e30 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
16e40 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
16e50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
16e60 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
16e70 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
16e80 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
16e90 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
16ea0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
16eb0 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
16ec0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
16ed0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
16ee0 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
16ef0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
16f00 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
16f10 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
16f20 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
16f30 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
16f40 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
16f50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
16f60 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
16f70 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
16f80 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
16f90 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
16fa0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
16fb0 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
16fc0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
16fd0 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
16fe0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
16ff0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
17000 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
17010 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
17020 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17030 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
17040 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
17050 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
17060 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17070 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
17080 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
17090 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
170a0 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
170b0 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
170c0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
170d0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
170e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
170f0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
17100 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
17110 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17120 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
17130 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67  MDB ){.      pag
17140 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17160 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17170 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
17180 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
17190 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
171a0 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
171b0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
171c0 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
171d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
171e0 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
171f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
17200 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
17210 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
17220 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
17230 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
17240 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
17250 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
17260 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
17270 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
17280 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
17290 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
172a0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
172b0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
172c0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
172d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
172e0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
172f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
17300 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
17310 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17320 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
17330 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
17340 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
17350 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
17360 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
17370 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
17380 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
17390 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
173a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
173b0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
173c0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
173d0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
173e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
173f0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
17400 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
17410 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
17420 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
17430 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
17440 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
17450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
17480 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
17490 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
174a0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
174b0 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
174c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
174d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
174e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
174f0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
17500 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
17510 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
17520 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
17530 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  , pPager->fullSy
17540 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
17550 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
17560 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
17570 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
17580 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74  ite3OsOpenDirect
17590 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ory(pPager->jfd,
175a0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
175b0 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ory);.  pPager->
175c0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
175d0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
175e0 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
175f0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
17600 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
17610 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
17620 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
17630 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
17640 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
17650 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
17660 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
17670 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
17680 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
17690 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
176a0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
176b0 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
176c0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
176d0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
176e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
176f0 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
17700 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
17710 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
17720 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72  tmt_begin(pPager
17730 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
17740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
17750 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
17760 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
17770 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
17780 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
17790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
177a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
177b0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
177c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
177d0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
177e0 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46  urnal:.  sqliteF
177f0 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
17800 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
17810 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
17820 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
17830 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
17840 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
17850 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
17860 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  re, then we will
17870 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67 20   not be closing 
17880 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
17890 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65   file. So delete
178a0 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   any journal fil
178b0 65 20 77 65 20 6d 61 79 20 68 61 76 65 20 6a 75  e we may have ju
178c0 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74 68 65  st created. Othe
178d0 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  rwise,.    ** th
178e0 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20 67 65  e system will ge
178f0 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65 20 68  t confused, we h
17900 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ave a read-lock 
17910 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
17920 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65 72 69  a.    ** mysteri
17930 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  ous journal has 
17940 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20  appeared in the 
17950 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20 20  filesystem..    
17960 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  */.    sqlite3Os
17970 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
17980 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73  Journal);.  }els
17990 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e{.    sqlite3Os
179a0 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
179b0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
179c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
179d0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
179e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
179f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
17a00 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
17a10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
17a20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
17a30 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
17a40 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
17a50 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
17a60 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
17a70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
17a80 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
17a90 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
17aa0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
17ab0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
17ac0 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
17ad0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
17ae0 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
17af0 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
17b00 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
17b10 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
17b20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
17b30 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
17b40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17b50 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
17b60 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
17b70 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17b80 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
17b90 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
17ba0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
17bb0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
17bc0 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
17bd0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
17be0 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
17bf0 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
17c00 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
17c10 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
17c20 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
17c30 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
17c40 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
17c50 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
17c60 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
17c70 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
17c80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
17c90 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
17ca0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
17cb0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
17cc0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
17cd0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
17ce0 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
17cf0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
17d00 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
17d10 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
17d20 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
17d30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
17d40 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
17d50 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
17d60 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
17d70 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
17d80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
17d90 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
17da0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
17db0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
17dc0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17dd0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
17de0 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
17df0 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
17e00 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
17e10 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
17e20 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
17e30 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
17e40 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
17e50 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
17e60 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
17e70 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
17e80 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
17e90 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
17ea0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
17eb0 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  gin(void *pData,
17ec0 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
17ed0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
17ee0 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
17ef0 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
17f00 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
17f10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
17f20 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
17f30 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
17f40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17f50 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
17f60 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
17f70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
17f80 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
17f90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17fa0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
17fb0 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
17fc0 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
17fd0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
17fe0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
17ff0 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
18000 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
18010 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
18020 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18030 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
18040 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
18050 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
18060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18070 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
18080 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
18090 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
180a0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
180b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
180c0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
180d0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
180e0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
180f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18120 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18130 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
18140 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
18150 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
18160 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
18170 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18180 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
18190 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
181a0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
181b0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
181c0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
181d0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
181e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
181f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
18210 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
18220 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
18230 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
18240 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
18250 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
18260 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
18270 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
18280 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
18290 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
182a0 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
182b0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
182c0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
182d0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
182e0 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
182f0 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
18300 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
18310 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
18320 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
18330 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
18340 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
18350 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
18360 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18370 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
18380 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
18390 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
183a0 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
183b0 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
183c0 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
183d0 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
183e0 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
183f0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
18400 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
18410 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
18420 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
18430 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
18440 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
18450 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
18460 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18470 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
18480 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
18490 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
184a0 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
184b0 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
184c0 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
184d0 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
184e0 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
184f0 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
18500 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
18510 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
18520 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
18530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18540 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
18550 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
18560 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
18570 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
18580 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
18590 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
185a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
185b0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
185c0 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
185d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
185e0 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
185f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
18600 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
18610 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
18620 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18630 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
18640 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
18650 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
18660 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
18670 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
18680 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
18690 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
186a0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
186b0 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
186c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
186d0 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
186e0 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
186f0 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
18700 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  1;.  if( pPg->in
18710 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d  Journal && (pPg-
18720 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65  >inStmt || pPage
18730 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
18740 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
18750 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
18760 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
18770 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
18780 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
18790 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
187a0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
187b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
187c0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
187d0 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
187e0 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
187f0 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
18800 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
18810 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
18820 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
18830 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
18840 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
18850 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
18860 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
18870 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18880 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
18890 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
188a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
188b0 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20  gin(pData, 0);. 
188c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
188d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
188e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
188f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18900 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
18910 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
18920 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
18930 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
18940 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
18950 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
18960 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
18970 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
18980 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18990 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
189a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
189b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
189c0 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
189d0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
189e0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
189f0 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
18a00 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
18a10 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
18a20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
18a30 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
18a40 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
18a50 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
18a60 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
18a70 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
18a80 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
18a90 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
18aa0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
18ab0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
18ac0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
18ad0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
18ae0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
18af0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
18b00 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
18b10 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
18b20 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
18b30 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
18b40 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
18b50 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 73 61  ;.        u32 sa
18b60 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ved;.        if(
18b70 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
18b80 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
18b90 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
18ba0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
18bb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  );.          TRA
18bc0 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE3("JOURNAL %d 
18bd0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
18be0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
18bf0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
18c00 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
18c10 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
18c20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
18c30 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Orig = sqliteMal
18c40 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e  locRaw( pPager->
18c50 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
18c60 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
18c70 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
18c80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
18c90 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
18ca0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
18cb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
18cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18cd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18ce0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
18cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;.          /* W
18d00 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
18d10 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
18d20 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
18d30 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
18d40 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
18d50 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
18d60 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
18d70 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
18d80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
18d90 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
18da0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18db0 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
18dc0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
18dd0 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r) );.          
18de0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
18df0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
18e00 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b  7);.          ck
18e10 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
18e20 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  m(pPager, pPg->p
18e30 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  gno, pData);.   
18e40 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
18e50 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
18e60 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
18e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  );.          sto
18e80 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20  re32bits(cksum, 
18e90 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
18ea0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
18eb0 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d    szPg = pPager-
18ec0 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20  >pageSize+8;.   
18ed0 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
18ee0 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ts(pPg->pgno, pP
18ef0 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20  g, -4);.        
18f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18f10 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
18f20 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74  d, &((char*)pDat
18f30 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20  a)[-4], szPg);. 
18f40 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
18f50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73  >journalOff += s
18f60 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54  zPg;.          T
18f70 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE4("JOURNAL %
18f80 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
18f90 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
18fb0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
18fc0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
18fd0 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
18fe0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
18ff0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
19000 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
19010 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
19020 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
19030 72 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20  r) = saved;.    
19040 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
19070 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
19080 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
19090 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
190a0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
190b0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
190c0 72 6f 72 28 70 50 61 67 65 72 2c 20 53 51 4c 49  ror(pPager, SQLI
190d0 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 20 20 20 20  TE_FULL);.      
190e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
190f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19100 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19110 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
19120 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
19130 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
19140 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
19150 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
19160 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
19170 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
19180 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
19190 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
191a0 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
191b0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
191c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
191d0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
191e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
191f0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
19200 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
19210 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
19220 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
19230 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
19240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19260 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
19270 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
19280 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
19290 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
192a0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
192b0 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e 44    TRACE4("APPEND
192c0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
192d0 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
192e0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
192f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
19300 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
19310 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  dSync);.      }.
19320 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
19330 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
19340 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
19350 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
19360 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
19370 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
19380 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
19390 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
193a0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
193b0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
193c0 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
193d0 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
193e0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
193f0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
19400 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
19410 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
19420 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
19430 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
19440 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
19450 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
19460 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
19470 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
19480 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
19490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
194a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
194b0 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
194c0 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
194d0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
194e0 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  mtSize ){.      
194f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
19500 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
19510 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
19520 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
19530 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
19540 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
19550 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
19560 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
19570 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
19580 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
19590 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
195a0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
195b0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
195c0 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
195d0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
195e0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
195f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
19600 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
19610 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
19620 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
19630 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
19640 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43    }.        TRAC
19650 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
19660 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
19670 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
19680 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
19690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
196a0 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
196b0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
196c0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
196d0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
196e0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
196f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19700 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
19710 72 2d 3e 73 74 66 64 2c 28 28 63 68 61 72 2a 29  r->stfd,((char*)
19720 70 44 61 74 61 29 2d 34 2c 0a 20 20 20 20 20 20  pData)-4,.      
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19740 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
19750 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20  >pageSize+4);.  
19760 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
19770 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
19780 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
19790 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
197a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43  pgno);.        C
197b0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
197c0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30  ta, pPg->pgno, 0
197d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
197e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
197f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19800 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
19810 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
19820 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
19830 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
19840 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
19850 6f 72 28 70 50 61 67 65 72 2c 20 53 51 4c 49 54  or(pPager, SQLIT
19860 45 5f 46 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  E_FULL);.       
19870 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
19880 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19890 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
198a0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
198b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
198c0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
198d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
198e0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
198f0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
19900 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
19910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
19920 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
19930 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
19940 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
19950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
19960 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
19970 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
19980 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
19990 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
199a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
199b0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
199c0 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
199d0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
199e0 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
199f0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
19a00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
19a10 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
19a20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19a30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
19a40 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
19a50 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
19a60 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
19a70 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
19a80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
19a90 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
19aa0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
19ab0 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
19ac0 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
19ad0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
19ae0 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
19af0 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
19b00 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
19b10 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
19b20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
19b30 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
19b40 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
19b50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19b60 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
19b70 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   Replace the con
19b80 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  tent of a single
19b90 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69   page with the i
19ba0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
19bb0 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d  e third.** argum
19bc0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
19bd0 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69  te3pager_overwri
19be0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
19bf0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
19c00 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69  d *pData){.  voi
19c10 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  d *pPage;.  int 
19c20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
19c30 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
19c40 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67  ger, pgno, &pPag
19c50 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
19c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
19c70 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
19c80 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
19c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
19cb0 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74  mcpy(pPage, pDat
19cc0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
19cd0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
19ce0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
19cf0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ef(pPage);.  }. 
19d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
19d10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
19d20 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
19d30 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
19d40 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
19d50 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
19d60 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
19d70 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
19d80 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74  "pgno" back to t
19d90 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
19da0 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
19db0 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
19dc0 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
19dd0 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
19de0 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
19df0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
19e00 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
19e10 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
19e20 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
19e30 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
19e40 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
19e50 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
19e60 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
19e70 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
19e80 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
19e90 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
19ea0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
19eb0 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
19ec0 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
19ed0 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
19ee0 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
19ef0 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
19f00 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
19f10 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
19f20 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
19f30 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
19f40 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
19f50 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
19f60 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
19f70 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
19f80 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
19f90 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
19fa0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
19fb0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
19fc0 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
19fd0 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
19fe0 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
19ff0 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1a000 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1a010 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1a020 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1a030 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1a040 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1a050 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1a060 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1a070 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1a080 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1a090 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1a0a0 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1a0b0 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1a0c0 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1a0d0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1a0e0 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1a0f0 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1a100 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1a110 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a120 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1a130 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64  reused,.** the d
1a140 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72  ont_rollback() r
1a150 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a160 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
1a170 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
1a180 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74  .** critical dat
1a190 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
1a1a0 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
1a1b0 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ets rolled back 
1a1c0 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74  in spite.** of t
1a1d0 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
1a1e0 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
1a1f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
1a200 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a  nt_write(Pager *
1a210 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1a220 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1a230 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
1a240 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20   return;..  pPg 
1a250 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1a260 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1a270 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1a280 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
1a290 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
1a2a0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
1a2b0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66  tInUse ){.    if
1a2c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1a2d0 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
1a2e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
1a2f0 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
1a300 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
1a310 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
1a320 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1a330 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
1a340 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
1a350 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
1a360 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
1a370 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1a380 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
1a390 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
1a3a0 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
1a3b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a3c0 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
1a3d0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1a3e0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
1a3f0 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
1a400 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
1a410 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
1a420 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
1a430 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
1a440 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
1a450 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
1a460 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
1a470 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1a480 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
1a490 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
1a4a0 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
1a4b0 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
1a4c0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
1a4d0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
1a4e0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
1a4f0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1a500 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
1a510 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
1a520 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
1a530 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50  f %d\n", pgno, P
1a540 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1a550 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
1a560 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
1a570 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1a580 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1a590 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1a5a0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1a5b0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
1a5c0 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
1a5d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
1a5e0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
1a5f0 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
1a600 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
1a610 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1a620 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
1a630 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
1a640 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
1a650 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1a660 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
1a670 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
1a680 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
1a690 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
1a6a0 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
1a6b0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1a6c0 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
1a6d0 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
1a6e0 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
1a6f0 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
1a700 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a710 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
1a720 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1a730 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  !=PAGER_EXCLUSIV
1a740 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  E || pPager->jou
1a750 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
1a760 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
1a770 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1a780 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
1a790 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
1a7a0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1a7b0 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1a7c0 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1a7d0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1a7e0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1a7f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a800 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1a810 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1a820 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1a830 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1a840 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1a850 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1a860 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
1a870 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1a880 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1a890 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1a8a0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1a8b0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
1a8c0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
1a8d0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
1a8e0 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e  .    TRACE3("DON
1a8f0 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
1a900 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
1a910 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1a920 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
1a930 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1a940 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1a950 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1a960 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1a970 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1a980 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1a990 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1a9a0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1a9b0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1a9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a9d0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1a9e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1a9f0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1aa00 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1aa10 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
1aa20 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1aa30 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
1aa40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1aa50 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
1aa60 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
1aa70 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
1aa80 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
1aa90 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
1aaa0 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
1aab0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
1aac0 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
1aad0 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
1aae0 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
1aaf0 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
1ab00 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
1ab10 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
1ab20 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
1ab30 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
1ab40 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
1ab50 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1ab60 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1ab70 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
1ab80 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
1ab90 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
1aba0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
1abb0 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
1abc0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1abd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
1abe0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
1abf0 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
1ac00 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
1ac10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1ac20 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  er_commit(Pager 
1ac30 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1ac40 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
1ac50 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1ac60 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
1ac70 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
1ac80 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  = sqlite3pager_r
1ac90 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1aca0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1acb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1acc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
1acd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1ace0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
1acf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ad00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
1ad10 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1ad20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1ad30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1ad40 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
1ad50 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
1ad60 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1ad70 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f    }.  TRACE2("CO
1ad80 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1ad90 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1ada0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1adb0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1adc0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1add0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
1ade0 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
1adf0 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
1ae00 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1ae10 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  , pPager));.    
1ae20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1ae30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1ae40 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1ae50 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
1ae60 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1ae70 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1ae80 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1ae90 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
1aea0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66  Dirty;.    }.#if
1aeb0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1aec0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1aed0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
1aee0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
1aef0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1af00 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1af10 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1af20 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
1af30 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
1af40 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1af50 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1af60 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
1af70 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
1af80 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
1af90 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
1afa0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1afb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1afc0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1afd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1afe0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
1aff0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1b000 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78  ==0 ){.    /* Ex
1b010 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75  it early (withou
1b020 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65  t doing the time
1b030 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74  -consuming sqlit
1b040 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73  e3OsSync() calls
1b050 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72  ).    ** if ther
1b060 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63  e have been no c
1b070 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1b080 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1b090 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b0a0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  er->needSync==0 
1b0b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1b0c0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
1b0d0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1b0e0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
1b0f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b100 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
1b110 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b120 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1b130 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61  e3pager_sync(pPa
1b140 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ger, 0, 0);.  if
1b150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b160 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  ){.    goto comm
1b170 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
1b180 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1b190 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1b1a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1b1b0 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
1b1c0 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
1b1d0 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ere if anything 
1b1e0 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e  goes wrong durin
1b1f0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
1b200 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69  cess..  */.commi
1b210 74 5f 61 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74  t_abort:.  sqlit
1b220 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
1b230 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1b240 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b250 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
1b260 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
1b270 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
1b280 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
1b290 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
1b2a0 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
1b2b0 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
1b2c0 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
1b2d0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
1b2e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
1b2f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
1b300 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
1b310 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
1b320 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1b330 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
1b340 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
1b350 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
1b360 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
1b370 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
1b380 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
1b390 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
1b3a0 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
1b3b0 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
1b3c0 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
1b3d0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
1b3e0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
1b3f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
1b400 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1b410 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
1b420 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
1b430 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
1b440 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
1b450 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1b460 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
1b470 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
1b480 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1b490 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
1b4a0 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
1b4b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1b4c0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1b4d0 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
1b4e0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1b4f0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
1b500 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
1b510 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
1b520 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
1b530 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
1b540 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1b550 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
1b560 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1b570 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1b580 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1b590 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
1b5a0 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
1b5b0 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
1b5c0 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
1b5d0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
1b5e0 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
1b5f0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b600 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
1b610 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1b620 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
1b630 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1b640 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
1b650 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
1b660 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
1b670 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
1b680 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1b690 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43   TRACE3("ROLLBAC
1b6a0 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
1b6b0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1b6c0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b6d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b6e0 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47 45      TRACE3("PAGE
1b6f0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
1b700 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
1b710 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1b720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b730 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
1b740 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
1b750 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1b760 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1b770 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74  .      p->inStmt
1b780 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
1b790 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e  PrevStmt = p->pN
1b7a0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  extStmt = 0;..  
1b7b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b7c0 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
1b7d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1b7e0 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
1b7f0 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d  DATA(p), pPager-
1b800 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1b810 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 7d    }.      .    }
1b820 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
1b830 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
1b840 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1b850 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1b860 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
1b870 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
1b880 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1b890 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
1b8a0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1b8b0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
1b8c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b8d0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1b8e0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
1b8f0 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
1b900 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
1b910 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1b920 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1b930 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1b940 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
1b950 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
1b960 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b970 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1b980 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1b990 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1b9a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1b9b0 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
1b9c0 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
1b9d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1b9e0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  }.    return pPa
1b9f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1ba00 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1ba10 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1ba20 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
1ba30 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70   rc2;.    rc = p
1ba40 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
1ba50 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
1ba60 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  c2 = pager_unwri
1ba70 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1ba80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ba90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1baa0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
1bab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1bac0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1bad0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
1bae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1baf0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1bb00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1bb10 3b 0a 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f  ;.    pager_erro
1bb20 72 28 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  r(pPager, SQLITE
1bb30 5f 43 4f 52 52 55 50 54 29 3b 0a 20 20 7d 0a 20  _CORRUPT);.  }. 
1bb40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1bb50 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72  = -1;.  return r
1bb60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1bb70 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
1bb80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1bb90 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
1bba0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
1bbb0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1bbc0 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
1bbd0 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
1bbe0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1bbf0 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  isreadonly(Pager
1bc00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1bc10 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
1bc20 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Only;.}../*.** T
1bc30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1bc40 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
1bc50 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
1bc60 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
1bc70 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 50 61  e3pager_stats(Pa
1bc80 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1bc90 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
1bca0 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
1bcb0 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
1bcc0 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
1bcd0 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
1bce0 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
1bcf0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1bd00 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
1bd10 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
1bd20 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
1bd30 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
1bd40 54 45 5f 54 45 53 54 0a 20 20 61 5b 36 5d 20 3d  TE_TEST.  a[6] =
1bd50 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
1bd60 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
1bd70 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
1bd80 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20  pPager->nOvfl;. 
1bd90 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
1bda0 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
1bdb0 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
1bdc0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1bdd0 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   a;.}../*.** Set
1bde0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
1bdf0 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
1be00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1be10 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
1be20 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
1be30 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1be40 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
1be50 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
1be60 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
1be70 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
1be80 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
1be90 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
1bea0 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
1beb0 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
1bec0 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
1bed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1bee0 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
1bef0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1bf00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1bf10 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
1bf20 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
1bf30 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1bf40 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
1bf50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1bf60 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20  >dbSize>=0 );.  
1bf70 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
1bf80 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
1bf90 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1bfa0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
1bfb0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1bfc0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1bfd0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
1bfe0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1bff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c000 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
1c010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1c020 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
1c030 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
1c040 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1c050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1c060 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1c070 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
1c080 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1c090 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1c0a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
1c0b0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
1c0c0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
1c0d0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
1c0e0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1c0f0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
1c100 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
1c110 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1c120 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1c130 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
1c140 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1c150 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
1c160 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
1c170 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
1c180 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
1c190 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c1a0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70  ->stmtJSize == p
1c1b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c1c0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  f );.#endif.  pP
1c1d0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1c1e0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1c1f0 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
1c200 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
1c210 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
1c220 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
1c230 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
1c240 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
1c250 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
1c260 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
1c270 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
1c280 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  = sqlite3pager_o
1c290 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
1c2a0 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
1c2b0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1c2c0 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
1c2d0 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ed;.    pPager->
1c2e0 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  stmtOpen = 1;.  
1c2f0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1c300 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ec = 0;.  }.  pP
1c310 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1c320 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1c330 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f  LITE_OK;. .stmt_
1c340 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20  begin_failed:.  
1c350 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
1c360 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
1c370 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
1c380 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67  nStmt);.    pPag
1c390 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
1c3a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c3b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1c3c0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
1c3d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1c3e0 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50  er_stmt_commit(P
1c3f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1c400 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1c410 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
1c420 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
1c430 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54  ;.    TRACE2("ST
1c440 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
1c450 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c460 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
1c470 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
1c480 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
1c490 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  >stfd, 0);.     
1c4a0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
1c4b0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74  ncate(pPager->st
1c4c0 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
1c4d0 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
1c4e0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
1c4f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1c500 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
1c510 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
1c520 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
1c530 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
1c540 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
1c550 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
1c560 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1c570 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1c580 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
1c590 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
1c5a0 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
1c5b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c5c0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1c5d0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1c5e0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1c5f0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1c600 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
1c610 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1c620 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
1c630 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
1c640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c650 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1c660 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
1c670 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1c680 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1c690 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
1c6a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1c6b0 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1c6c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c6d0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1c6e0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
1c6f0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1c700 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50  _stmt_rollback(P
1c710 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1c720 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
1c730 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1c740 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22   ){.    TRACE2("
1c750 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
1c760 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c770 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
1c780 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
1c790 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
1c7a0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1c7b0 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
1c7c0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
1c7d0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1c7e0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1c7f0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1c800 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1c810 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1c820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1c830 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
1c840 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
1c850 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
1c860 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c870 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1c880 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1c890 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1c8a0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c8b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c8c0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1c8d0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
1c8e0 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
1c8f0 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
1c900 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1c910 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1c920 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1c930 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
1c940 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1c950 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
1c960 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
1c970 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
1c980 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1c990 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
1c9a0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1c9b0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1c9c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c9d0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
1c9e0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1c9f0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1ca00 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1ca10 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
1ca20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ca30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1ca40 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
1ca50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1ca60 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
1ca70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1ca80 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1ca90 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61  lite3pager_dirna
1caa0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1cab0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1cac0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
1cad0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cae0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1caf0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1cb00 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1cb10 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1cb20 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  er_journalname(P
1cb30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1cb40 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1cb50 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
1cb60 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1cb70 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
1cb80 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
1cb90 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
1cba0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
1cbb0 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
1cbc0 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
1cbd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1cbe0 61 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65  ager_nosync(Page
1cbf0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1cc00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
1cc10 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ync;.}../*.** Se
1cc20 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
1cc30 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
1cc40 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
1cc50 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67  set_codec(.  Pag
1cc60 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
1cc70 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
1cc80 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
1cc90 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
1cca0 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
1ccb0 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
1ccc0 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
1ccd0 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
1cce0 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
1ccf0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1cd00 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1cd10 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1cd20 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1cd30 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1cd40 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1cd50 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1cd60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1cd70 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1cd80 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1cd90 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
1cda0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  ;.  PgHdr *pPgHd
1cdb0 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1cdc0 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1cdd0 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61  c;..  /* Open pa
1cde0 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
1cdf0 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
1ce00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1ce10 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1ce20 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69   1, &pPage);.  i
1ce30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ce40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ce50 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1ce60 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1ce70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ce80 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1ce90 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1cea0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1ceb0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70   byte 24. */.  p
1cec0 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f  PgHdr = DATA_TO_
1ced0 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20  PGHDR(pPage);.  
1cee0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1cef0 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
1cf00 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
1cf10 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1cf20 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1cf30 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1cf40 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1cf50 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1cf60 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62  er++;.  store32b
1cf70 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74  its(change_count
1cf80 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b  er, pPgHdr, 24);
1cf90 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
1cfa0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
1cfb0 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70  e. */.  sqlite3p
1cfc0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
1cfd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1cfe0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1cff0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
1d000 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
1d010 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
1d020 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
1d030 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
1d040 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d050 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1d060 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1d070 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
1d080 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1d090 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
1d0a0 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
1d0b0 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
1d0c0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
1d0d0 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
1d0e0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1d0f0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
1d100 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
1d110 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1d120 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69  s synced, all di
1d130 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65  rty pages writte
1d140 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  n.** to the data
1d150 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
1d160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d170 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79  synced. The only
1d180 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72   thing that.** r
1d190 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
1d1a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d1b0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1d1c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1d1d0 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  or.** master jou
1d1e0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
1d1f0 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
1d200 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
1d210 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
1d220 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
1d230 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
1d240 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
1d250 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72   an sqlite3pager
1d260 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a  _sync() call..**
1d270 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1d280 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a   nTrunc is non-z
1d290 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61  ero, then the pa
1d2a0 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ger file is trun
1d2b0 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75  cated to.** nTru
1d2c0 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69  nc pages (this i
1d2d0 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  s used by auto-v
1d2e0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29  acuum databases)
1d2f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d300 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72  pager_sync(Pager
1d310 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
1d320 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50  char *zMaster, P
1d330 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69  gno nTrunc){.  i
1d340 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d350 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41  K;..  TRACE4("DA
1d360 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
1d370 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
1d380 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
1d390 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
1d3a0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
1d3b0 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20   nTrunc);..  /* 
1d3c0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
1d3d0 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
1d3e0 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
1d3f0 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
1d400 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1d410 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1d420 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
1d430 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1d440 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1d450 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
1d460 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
1d470 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1d480 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
1d490 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
1d4a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1d4b0 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a  lOpen );..    /*
1d4c0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1d4d0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
1d4e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d4f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
1d500 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1d510 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
1d520 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
1d530 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1d540 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
1d550 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
1d560 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
1d570 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
1d580 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
1d590 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1d5a0 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
1d5b0 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
1d5c0 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
1d5d0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
1d5e0 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
1d5f0 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
1d600 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1d610 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1d620 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1d630 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
1d640 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1d650 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1d660 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1d670 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1d680 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23  oto sync_exit;.#
1d690 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d6a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1d6b0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1d6c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1d6d0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1d6e0 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1d6f0 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1d700 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1d710 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69  s.        ** bei
1d720 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
1d730 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
1d740 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
1d750 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
1d760 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
1d770 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d780 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
1d790 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1d7a0 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70         int iSkip
1d7b0 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
1d7c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d7d0 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
1d7e0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
1d7f0 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
1d800 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1d810 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1d820 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28  nal[i/8] & (1<<(
1d830 69 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b  i&7))) && i!=iSk
1d840 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
1d850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1d860 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
1d870 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
1d880 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d890 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1d8a0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1d8b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d8c0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1d8d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1d8e0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1d8f0 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
1d900 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1d910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1d920 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1d930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d940 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65     } .      }.#e
1d950 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
1d960 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
1d970 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
1d980 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1d990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1d9a0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1d9b0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
1d9c0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1d9d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d9e0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d9f0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  nc_exit;.    }..
1da00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1da10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1da20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1da30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1da40 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
1da50 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1da60 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
1da70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1da80 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1da90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1daa0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
1dab0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
1dac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1dad0 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
1dae0 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1daf0 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
1db00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1db10 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
1db20 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1db30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1db40 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20   sync_exit;..   
1db50 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
1db60 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1db70 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1db80 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
1db90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1dba0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  nc(pPager->fd, 0
1dbb0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
1dbc0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1dbd0 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
1dbe0 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
1dbf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1dc00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dc10 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
1dc20 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69   Move the page i
1dc30 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61  dentified by pDa
1dc40 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  ta to location p
1dc50 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
1dc60 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
1dc70 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
1dc80 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65  ces to the curre
1dc90 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66  nt page pgno. If
1dca0 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a   current page.**
1dcb0 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
1dcc0 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  eady in the roll
1dcd0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
1dce0 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
1dcf0 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74  there by.** by t
1dd00 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65  his routine. The
1dd10 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f   same applies to
1dd20 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20   the page pData 
1dd30 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74  refers to on ent
1dd40 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ry to.** this ro
1dd50 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
1dd60 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
1dd70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  age refered to b
1dd80 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76  y pData remain v
1dd90 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
1dda0 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
1ddb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ddc0 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e  page pData (i.e.
1ddd0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
1dde0 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
1ddf0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
1de00 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
1de10 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
1de20 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1de30 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
1de40 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1de50 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
1de60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1de70 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
1de80 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
1de90 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
1dea0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
1deb0 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
1dec0 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
1ded0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
1dee0 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
1def0 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
1df00 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
1df10 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
1df20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
1df30 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tive)..*/.int sq
1df40 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
1df50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
1df60 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  r, void *pData, 
1df70 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1df80 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
1df90 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
1dfa0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
1dfb0 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67  ; .  int h;.  Pg
1dfc0 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  no needSyncPgno 
1dfd0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1dfe0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
1dff0 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25    TRACE5("MOVE %
1e000 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
1e010 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
1e020 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
1e030 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1e040 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1e050 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
1e060 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  ..  if( pPg->nee
1e070 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65  dSync ){.    nee
1e080 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
1e090 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
1e0a0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1e0b0 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
1e0c0 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20   pPg->dirty );. 
1e0d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e0e0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
1e0f0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
1e100 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
1e110 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e  sh-chain */.  un
1e120 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1e130 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f  ager, pPg);..  /
1e140 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
1e150 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
1e160 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
1e170 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
1e180 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68    ** from it's h
1e190 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
1e1a0 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
1e1b0 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
1e1c0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
1e1d0 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
1e1e0 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
1e1f0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
1e200 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
1e210 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
1e220 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
1e230 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
1e240 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1e250 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
1e260 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e270 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
1e280 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
1e290 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
1e2a0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f  PgOld);.    pPgO
1e2b0 6c 64 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  ld->dirty = 0;. 
1e2c0 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e     if( pPgOld->n
1e2d0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1e2e0 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
1e2f0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
1e300 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1e310 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  al = 1;.      pP
1e320 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  g->needSync = 1;
1e330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e340 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1e350 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e360 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  /* Change the pa
1e370 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
1e380 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  g and insert it 
1e390 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73  into the new has
1e3a0 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50  h-chain. */.  pP
1e3b0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
1e3c0 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68    h = pager_hash
1e3d0 28 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50  (pgno);.  if( pP
1e3e0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
1e3f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1e400 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1e410 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
1e420 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
1e430 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
1e440 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
1e450 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
1e460 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
1e470 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
1e480 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
1e490 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
1e4a0 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
1e4b0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  1;.  pPager->dir
1e4c0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
1e4d0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
1e4e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
1e4f0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
1e500 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1e510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
1e520 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
1e530 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
1e540 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
1e550 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
1e560 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
1e570 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
1e580 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
1e590 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
1e5a0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
1e5b0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
1e5c0 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e  * Pager.aInJourn
1e5d0 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
1e5e0 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
1e5f0 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
1e600 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
1e610 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
1e620 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
1e630 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
1e640 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
1e650 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
1e660 2a 20 54 68 65 20 73 71 6c 69 74 65 33 70 61 67  * The sqlite3pag
1e670 65 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d 61  er_get() call ma
1e680 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
1e690 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
1e6a0 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
1e6b0 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
1e6c0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
1e6d0 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
1e6e0 69 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69 64  int rc;.    void
1e6f0 20 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20   *pNeedSync;.   
1e700 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e710 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1e720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1e730 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 6e  er_get(pPager, n
1e740 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e  eedSyncPgno, &pN
1e750 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69 66  eedSync);.    if
1e760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e770 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e780 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1e790 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  c = 1;.    DATA_
1e7a0 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1e7b0 6e 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  nc)->needSync = 
1e7c0 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50  1;.    DATA_TO_P
1e7d0 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d  GHDR(pNeedSync)-
1e7e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1e7f0 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1e800 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69  R(pNeedSync)->di
1e810 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  rty = 1;.    sql
1e820 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
1e830 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a  pNeedSync);.  }.
1e840 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e850 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
1e860 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1e870 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1e880 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
1e890 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1e8a0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1e8b0 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
1e8c0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
1e8d0 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
1e8e0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
1e8f0 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
1e900 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
1e910 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
1e920 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
1e930 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
1e940 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1e950 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72  _lockstate(Pager
1e960 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1e970 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  urn sqlite3OsLoc
1e980 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66  kState(pPager->f
1e990 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  d);.}.#endif..#i
1e9a0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1e9b0 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  G./*.** Print a 
1e9c0 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
1e9d0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
1e9e0 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
1e9f0 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
1ea00 69 74 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d  ite3pager_refdum
1ea10 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
1ea20 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1ea30 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1ea40 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
1ea50 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
1ea60 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
1ea70 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
1ea80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
1ea90 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25  ugPrintf("PAGE %
1eaa0 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  3d addr=%p nRef=
1eab0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70  %d\n", .       p
1eac0 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f  Pg->pgno, PGHDR_
1ead0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1eae0 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a  g->nRef);.  }.}.
1eaf0 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f  #endif..#endif /
1eb00 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
1eb10 53 4b 49 4f 20 2a 2f 0a                          SKIO */.