/ Hex Artifact Content
Login

Artifact 0f1565938ca972490ff72a8dc0a90d3a1d563883:


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: 39 20 32 30 30 36 2f 30 31 2f 32 31 20 31 32 3a  9 2006/01/21 12:
0360: 30 38 3a 35 34 20 64 61 6e 69 65 6c 6b 31 39 37  08:54 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: 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f  .    rc==SQLITE_
4c50: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 3d  IOERR ||.    rc=
4c60: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
4c70: 7c 7c 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  ||.    rc==SQLIT
4c80: 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a  E_PROTOCOL.  ){.
4c90: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4ca0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
4cb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
4cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
4cd0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
4ce0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
4cf0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
4d00: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
4d10: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
4d20: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
4d30: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32  r *pPage){.  u32
4d40: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
4d50: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
4d60: 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e  har *pData = (un
4d70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
4d80: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
4d90: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
4da0: 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  <pPage->pPager->
4db0: 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  pageSize; i++){.
4dc0: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
4dd0: 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20  +i)^pData[i];.  
4de0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
4df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
4e00: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
4e10: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
4e20: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
4e30: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
4e40: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
4e50: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
4e60: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
4e70: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
4e80: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
4e90: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
4ea0: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
4eb0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
4ec0: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
4ed0: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
4ee0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
4ef0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
4f00: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
4f10: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
4f20: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
4f30: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
4f40: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
4f50: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
4f60: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
4f70: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
4f80: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
4f90: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
4fa0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
4fb0: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
4fc0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
4fd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
4fe0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
4ff0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
5000: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
5010: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
5020: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
5030: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5040: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
5050: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
5060: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
5070: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
5080: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5090: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70  liteMalloc(). *p
50a0: 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65  zMaster is.** se
50b0: 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  t to point at th
50c0: 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  e memory and SQL
50d0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
50e0: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
50f0: 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29  .** sqliteFree()
5100: 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a   *pzMaster..**.*
5110: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
5120: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5130: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d   is present *pzM
5140: 61 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  aster is set to 
5150: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
5160: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
5170: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
5180: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46  asterJournal(OsF
5190: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
51a0: 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20   **pzMaster){.  
51b0: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65  int rc;.  u32 le
51c0: 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20  n;.  i64 szJ;.  
51d0: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
51e0: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
51f0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
5200: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
5210: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
5220: 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73  der */..  *pzMas
5230: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  ter = 0;..  rc =
5240: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5250: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
5260: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5270: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
5280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5290: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
52a0: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29  k(pJrnl, szJ-16)
52b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
52c0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
52d0: 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64  c;. .  rc = read
52e0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c  32bits(pJrnl, &l
52f0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5300: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5310: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
5320: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5330: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5350: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5360: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
5370: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
5380: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5390: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
53a0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
53b0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
53c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
53d0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
53e0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  rnl, szJ-16-len)
53f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5400: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5410: 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  c;..  *pzMaster 
5420: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
5430: 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20  Malloc(len+1);. 
5440: 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20   if( !*pzMaster 
5450: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5460: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
5470: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5480: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
5490: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
54a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
54b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
54c0: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
54d0: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
54e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
54f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
5500: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
5510: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
5520: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
5530: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
5540: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
5550: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
5560: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
5570: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5580: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5590: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
55a0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
55b0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
55c0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
55d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
55e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
55f0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5600: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5610: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
5620: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
5630: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
5640: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5650: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
5660: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5670: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5680: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
5690: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
56a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c  aster = 0;.  }el
56b0: 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74  se{.    (*pzMast
56c0: 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  er)[len] = '\0';
56d0: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
56e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
56f0: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
5700: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
5710: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
5720: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
5730: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
5740: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
5750: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
5760: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
5770: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
5780: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
5790: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
57a0: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
57b0: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
57c0: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
57d0: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
57e0: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
57f0: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
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 0a 2a 2a 20 30 20  ----------.** 0 
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
5860: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5870: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
5880: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
5890: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
58a0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
58b0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
58c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
58d0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
58e0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
58f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5900: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
5910: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
5920: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5930: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
5940: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5950: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5960: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5970: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5980: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5990: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
59a0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
59b0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
59c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
59d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
59e0: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
59f0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65  urn sqlite3OsSee
5a00: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
5a10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5a20: 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  f);.}../*.** The
5a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
5a40: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
5a50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5a60: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5a70: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
5a80: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
5a90: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
5aa0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
5ab0: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
5ac0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
5ad0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5ae0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
5af0: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
5b00: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
5b10: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
5b20: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
5b30: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
5b40: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
5b50: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
5b60: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
5b70: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
5b80: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
5b90: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
5ba0: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
5bb0: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
5bc0: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
5bd0: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
5be0: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
5bf0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
5c00: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
5c10: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
5c20: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
5c30: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
5c40: 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66  Z - 24) bytes of
5c50: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
5c60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5c70: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
5c80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63  er *pPager){.  c
5c90: 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65  har zHeader[size
5ca0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
5cb0: 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20 72 63  )+16];..  int rc
5cc0: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5cd0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5ce0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5cf0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5d00: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5d10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5d20: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5d30: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5d40: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5d50: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5d60: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5d70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5d80: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5d90: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
5da0: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
5db0: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
5dc0: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
5dd0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
5de0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
5df0: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
5e00: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
5e10: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
5e20: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
5e30: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
5e40: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
5e50: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
5e60: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
5e70: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
5e80: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
5e90: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
5ea0: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
5eb0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ..  */.  memcpy(
5ec0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
5ed0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
5ee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
5ef0: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
5f00: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
5f10: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
5f20: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32  nals. */.  put32
5f30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
5f40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5f50: 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f  ic)], pPager->no
5f60: 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66  Sync ? 0xfffffff
5f70: 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65  f : 0);.  /* The
5f80: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
5f90: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
5fa0: 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64  / .  sqlite3Rand
5fb0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
5fc0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
5fd0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
5fe0: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
5ff0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6000: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6010: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
6020: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
6030: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
6040: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
6050: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6060: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6070: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
6080: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
6090: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
60a0: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
60b0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
60c0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
60d0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
60e0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
60f0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6100: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
6110: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6120: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
6130: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a  zeof(zHeader));.
6140: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
6150: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
6160: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
6170: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
6180: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
6190: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
61a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
61b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
61c0: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
61d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
61e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
61f0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
6200: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
6210: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
6220: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6230: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
6240: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
6250: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  (pPager->jfd, "\
6260: 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  000", 1);.    }.
6270: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
6290: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
62a0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
62b0: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
62c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
62d0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
62e0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
62f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
6300: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
6310: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
6320: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
6330: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
6340: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
6350: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
6360: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
6370: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6380: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
6390: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
63a0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
63b0: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
63c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
63d0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
63e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
63f0: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
6400: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
6410: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
6420: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
6430: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
6440: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
6450: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
6460: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
6470: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
6480: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
6490: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
64a0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
64b0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
64c0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
64d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
64e0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
64f0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
6500: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
6510: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
6520: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
6530: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
6540: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6550: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
6560: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
6570: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
6580: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
6590: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
65a0: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
65b0: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
65c0: 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f  Pager, .  i64 jo
65d0: 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32  urnalSize,.  u32
65e0: 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20   *pNRec, .  u32 
65f0: 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e  *pDbSize.){.  in
6600: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
6610: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
6620: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
6630: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
6640: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d  eader */..  rc =
6650: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
6660: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
6670: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6680: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6690: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
66a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
66b0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
66c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
66d0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
66e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
66f0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
6700: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
6710: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
6720: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6730: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
6740: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6750: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6760: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
6770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6780: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
6790: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
67a0: 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20  >jfd, pNRec);.  
67b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
67c0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
67d0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
67e0: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
67f0: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
6800: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6820: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6830: 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  DbSize);.  if( r
6840: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6850: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
6860: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
6870: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
6880: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
6890: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
68a0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
68b0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
68c0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
68d0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
68e0: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
68f0: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
6900: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6910: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  .  ** is being c
6920: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
6930: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6940: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
6950: 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65  lue.  ** of Page
6960: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
6970: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
6980: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
6990: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ine..  */.  rc =
69a0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
69b0: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
69c0: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
69d0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
69e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
69f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6a00: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
6a10: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
6a20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
6a30: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
6a40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6a50: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
6a60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
6a70: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
6a80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6a90: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
6aa0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
6ab0: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
6ac0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
6ad0: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
6ae0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
6af0: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
6b00: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
6b10: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
6b20: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
6b30: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
6b40: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
6b50: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
6b60: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
6b70: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
6b80: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
6b90: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
6ba0: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
6bb0: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
6bc0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
6bd0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e  _MJ_PGNO..** + N
6be0: 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f   bytes: length o
6bf0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
6c00: 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79   name..** + 4 by
6c10: 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79  tes: N.** + 4 by
6c20: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
6c30: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
6c40: 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a  m..** + 8 bytes:
6c50: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
6c60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
6c70: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
6c80: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
6c90: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
6ca0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
6cb0: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  * journal name..
6cc0: 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
6cd0: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
6ce0: 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
6cf0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
6d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
6d10: 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
6d20: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
6d30: 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
6d40: 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
6d50: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
6d60: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
6d70: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
6d80: 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20  en; .  int i; . 
6d90: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a   u32 cksum = 0;.
6da0: 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65    char zBuf[size
6db0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6dc0: 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21  )+2*4];..  if( !
6dd0: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
6de0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
6df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6e00: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
6e10: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
6e20: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
6e30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6e40: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
6e50: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
6e60: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
6e70: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
6e80: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
6e90: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
6ea0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
6eb0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
6ec0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
6ed0: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
6ee0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
6ef0: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
6f00: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6f10: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
6f20: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
6f30: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
6f40: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
6f50: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6f60: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
6f70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6f80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
6f90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6fa0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
6fb0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
6fc0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6fd0: 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
6fe0: 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
6ff0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7000: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7010: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7020: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7030: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
7040: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7050: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
7060: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
7070: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
7080: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
7090: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
70a0: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
70b0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
70c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
70d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
70e0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
70f0: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
7100: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7110: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
7120: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
7130: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72  >noSync;.  retur
7140: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7150: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
7160: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
7170: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
7180: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
7190: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
71a0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
71b0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
71c0: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
71d0: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
71e0: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
71f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7200: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
7210: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
7220: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _stmt_commit().*
7230: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7240: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7250: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
7260: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
7270: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
7280: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
7290: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
72a0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
72b0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
72c0: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
72d0: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
72e0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
72f0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7300: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
7310: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
7320: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7330: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
7340: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  Pg->pNextStmt==0
7350: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
7360: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
7370: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
7380: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
7390: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
73a0: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
73b0: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67  pNextStmt = pPag
73c0: 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61  er->pStmt;.  pPa
73d0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
73e0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
73f0: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
7400: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
7410: 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  rom_stmt_list(Pg
7420: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
7430: 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20   !pPg->inStmt ) 
7440: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
7450: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a  g->pPrevStmt ){.
7460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7470: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
7480: 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tStmt==pPg );.  
7490: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
74a0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
74b0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
74c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
74d0: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
74e0: 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pStmt==pPg );.  
74f0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
7500: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
7510: 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tStmt;.  }.  if(
7520: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7530: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7540: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
7550: 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b  PrevStmt==pPg );
7560: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53  .    pPg->pNextS
7570: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
7580: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b   pPg->pPrevStmt;
7590: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
75a0: 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  tStmt = 0;.  pPg
75b0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
75c0: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
75d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
75e0: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
75f0: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
7600: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
7610: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7620: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7630: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
7640: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
7650: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
7660: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
7670: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
7680: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70  {.  PgHdr *p = p
7690: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
76a0: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a  er_hash(pgno)];.
76b0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
76c0: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
76d0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
76e0: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
76f0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
7700: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
7710: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
7720: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
7730: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
7740: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
7750: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
7760: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
7770: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
7780: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
7790: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
77a0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
77b0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
77c0: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
77d0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
77e0: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
77f0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
7800: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
7810: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
7820: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
7830: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
7840: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
7850: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
7860: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7870: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
7880: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
7890: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
78a0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
78b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
78c0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
78d0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
78e0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
78f0: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
7900: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
7910: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
7920: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
7930: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
7940: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
7950: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
7960: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
7970: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
7980: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
7990: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
79a0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
79b0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
79c0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
79d0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
79e0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
79f0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7a00: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7a10: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
7a20: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73  >nRef = 0;.  ass
7a30: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
7a40: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d  rnalOpen==0 );.}
7a50: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
7a60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7a70: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
7a80: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
7a90: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
7aa0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
7ab0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
7ac0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
7ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65  his routine rele
7ae0: 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ases.** the data
7af0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
7b00: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
7b10: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
7b20: 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a  e.  The journal.
7b30: 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  ** file is delet
7b40: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a  ed and closed..*
7b50: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
7b60: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
7b70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
7b80: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
7b90: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
7ba0: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
7bb0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
7bc0: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
7bd0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
7be0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
7bf0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
7c00: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7c10: 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74  int pager_unwrit
7c20: 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  elock(Pager *pPa
7c30: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7c40: 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Pg;.  int rc;.  
7c50: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
7c60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7c70: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
7c80: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
7c90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7ca0: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
7cb0: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
7cc0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
7cd0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
7ce0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7cf0: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
7d00: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
7d10: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
7d20: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7d30: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
7d40: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7d50: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
7d60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
7d70: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
7d80: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
7d90: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
7da0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
7db0: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
7dc0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
7dd0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7de0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
7df0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
7e00: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
7e10: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
7e20: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
7e30: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
7e40: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
7e50: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
7e60: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7e70: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
7e80: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
7e90: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
7ea0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
7eb0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
7ec0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
7ed0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
7ee0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7ef0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7f00: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
7f10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7f20: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
7f30: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
7f40: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
7f50: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
7f60: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
7f70: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
7f80: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
7f90: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
7fa0: 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d  HARED;.  pPager-
7fb0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
7fc0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
7fd0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
7fe0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
7ff0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
8000: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
8010: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 72 65 74  r->pFirst;.  ret
8020: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8030: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
8040: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
8050: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
8060: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
8070: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
8080: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
8090: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
80a0: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
80b0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
80c0: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
80d0: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
80e0: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
80f0: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
8100: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
8110: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
8120: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
8130: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
8140: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
8150: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
8160: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
8170: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
8180: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
8190: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
81a0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
81b0: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
81c0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
81d0: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
81e0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
81f0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
8200: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
8210: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
8220: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
8230: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
8240: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
8250: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
8260: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
8270: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
8280: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
8290: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
82a0: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
82b0: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
82c0: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
82d0: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
82e0: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
82f0: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
8300: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
8310: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
8320: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
8330: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
8340: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
8350: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
8360: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
8370: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
8380: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
8390: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
83a0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
83b0: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
83c0: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
83d0: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
83e0: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
83f0: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
8400: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
8410: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
8420: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
8430: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
8440: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
8450: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
8460: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f  r, Pgno pgno, co
8470: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
8480: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
8490: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
84a0: 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
84b0: 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
84c0: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
84d0: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
84e0: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
84f0: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
8500: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
8510: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
8520: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
8530: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8540: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
8550: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
8560: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
8570: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
8580: 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d  useCksum==0 it m
8590: 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61  eans this journa
85a0: 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63  l does not use c
85b0: 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b  hecksums.  Check
85c0: 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  sums.** are not 
85d0: 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e  used in statemen
85e0: 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75  t journals becau
85f0: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  se statement jou
8600: 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20  rnals do not.** 
8610: 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20  need to survive 
8620: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a  power failures..
8630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8640: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
8650: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
8660: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
8670: 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b  , int useCksum){
8680: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
8690: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
86a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
86b0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
86c0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
86d0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86f0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
8700: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
8710: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
8720: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
8730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
8740: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
8750: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
8760: 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c  /.  u8 aData[SQL
8770: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
8780: 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f  E];  /* Temp sto
8790: 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20  rage for a page 
87a0: 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75  */..  /* useCksu
87b0: 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65  m should be true
87c0: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f   for the main jo
87d0: 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20  urnal and false 
87e0: 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  for.  ** stateme
87f0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65  nt journals.  Ve
8800: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69  rify that this i
8810: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
8820: 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
8830: 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75   jfd == (useCksu
8840: 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  m ? pPager->jfd 
8850: 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20  : pPager->stfd) 
8860: 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  );...  rc = read
8870: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e  32bits(jfd, &pgn
8880: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
8890: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
88a0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
88b0: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26  te3OsRead(jfd, &
88c0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
88d0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
88e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
88f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
8900: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
8910: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
8920: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
8930: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
8940: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
8950: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
8960: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
8970: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
8980: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
8990: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
89a0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
89b0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
89c0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
89d0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
89e0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
89f0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
8a00: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
8a10: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
8a20: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
8a30: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
8a40: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
8a50: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
8a60: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
8a70: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
8a80: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
8a90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8aa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
8ab0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
8ac0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
8ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8ae0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
8af0: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
8b00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
8b10: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
8b20: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8b30: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
8b40: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
8b50: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
8b60: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  sum(pPager, pgno
8b70: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
8b80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8b90: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8ba0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
8bb0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8bc0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
8bd0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
8be0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
8bf0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
8c00: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
8c10: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
8c20: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
8c30: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
8c40: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
8c50: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
8c60: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
8c70: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
8c80: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
8c90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8ca0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
8cb0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
8cc0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
8cd0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
8ce0: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
8cf0: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
8d00: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
8d10: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
8d20: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
8d30: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
8d40: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
8d50: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
8d60: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
8d70: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
8d80: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
8d90: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
8da0: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
8db0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
8dc0: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
8dd0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
8de0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
8df0: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
8e00: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
8e10: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
8e20: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
8e30: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
8e40: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
8e50: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
8e60: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
8e70: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
8e80: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
8e90: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
8ea0: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
8eb0: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
8ec0: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
8ed0: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
8ee0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
8ef0: 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74  ontents are in t
8f00: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
8f10: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
8f20: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20  Otherwise, if a 
8f30: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63  full ROLLBACK oc
8f40: 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73  curs after the s
8f50: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f  tatement.  ** ro
8f60: 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20  llback the full 
8f70: 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f  ROLLBACK will no
8f80: 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61  t restore the pa
8f90: 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ge to its origin
8fa0: 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  al.  ** content.
8fb0: 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
8fc0: 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66   must be met bef
8fd0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
8fe0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
8ff0: 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
9000: 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
9010: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
9020: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
9030: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  riginal.  ** pag
9040: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20  e content is in 
9050: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
9060: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
9070: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
9080: 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72  in.  ** cache or
9090: 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b   else it is mark
90a0: 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
90b0: 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  0..  */.  pPg = 
90c0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
90d0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
90e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
90f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9100: 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29  SIVE || pPg!=0 )
9110: 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59  ;.  TRACE3("PLAY
9120: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c  BACK %d page %d\
9130: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
9140: 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  er), pgno);.  if
9150: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
9160: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9170: 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70   && (pPg==0 || p
9180: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29  Pg->needSync==0)
9190: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
91a0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
91b0: 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
91c0: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
91d0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
91e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
91f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9200: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9210: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
9220: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9230: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
9240: 50 67 20 29 20 70 50 67 2d 3e 64 69 72 74 79 20  Pg ) pPg->dirty 
9250: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
9260: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
9270: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
9280: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
9290: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
92a0: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
92b0: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
92c0: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
92d0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
92e0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
92f0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
9300: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
9310: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
9320: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
9330: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
9340: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
9350: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
9360: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
9370: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
9380: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
9390: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
93a0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
93b0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f  id *pData;.    /
93c0: 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e  * assert( pPg->n
93d0: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
93e0: 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  gno==1 ); */.   
93f0: 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54   pData = PGHDR_T
9400: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20  O_DATA(pPg);.   
9410: 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61   memcpy(pData, a
9420: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9430: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
9440: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
9450: 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49  ctor ){  /*** FI
9460: 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68  X ME:  Should th
9470: 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a  is be xReinit? *
9480: 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72  **/.      pPager
9490: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
94a0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
94b0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69  eSize);.    }.#i
94c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
94d0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
94e0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
94f0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
9500: 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45  .#endif.    CODE
9510: 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
9520: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
9530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
9550: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
9560: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
9570: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9580: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
9590: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
95a0: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
95b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
95c0: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
95d0: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
95e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
95f0: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
9600: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
9610: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9620: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
9630: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
9640: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  is..**.** The ma
9650: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9660: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
9670: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
9680: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
9690: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
96a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
96b0: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
96c0: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
96d0: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
96e0: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
96f0: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
9700: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
9710: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
9720: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
9730: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
9740: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
9750: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
9760: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9770: 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20  delmaster(const 
9780: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
9790: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
97a0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
97b0: 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65  .  OsFile *maste
97c0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
97d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
97e0: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
97f0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
9800: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
9810: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
9820: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9830: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9840: 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65  ile */..  /* Ope
9850: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
9860: 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73  rnal file exclus
9870: 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f  ively in case so
9880: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
9890: 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67  .  ** is running
98a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
98b0: 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20  so. Not that it 
98c0: 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64  makes too much d
98d0: 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
98e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
98f0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61  OpenReadOnly(zMa
9900: 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a  ster, &master);.
9910: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9920: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
9930: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
9940: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
9950: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
9960: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
9970: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9980: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9990: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
99a0: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
99b0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
99c0: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
99d0: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
99e0: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
99f0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
9a00: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
9a10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
9a20: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
9a30: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
9a40: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
9a50: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
9a60: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
9a70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
9a80: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
9a90: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
9aa0: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
9ab0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
9ac0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
9ad0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9ae0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
9af0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9b00: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
9b10: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
9b20: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
9b30: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
9b40: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
9b50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9b60: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9b70: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
9b80: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
9b90: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
9ba0: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
9bb0: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
9bc0: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
9bd0: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
9be0: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
9bf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9c00: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
9c10: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
9c20: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
9c30: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
9c40: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
9c50: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
9c60: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
9c70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
9c80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
9c90: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
9ca0: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
9cb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9cc0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9cd0: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
9ce0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
9cf0: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
9d00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
9d10: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
9d20: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
9d30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
9d40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9d50: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
9d60: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9d70: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
9d80: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
9d90: 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26  urnal(journal, &
9da0: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
9db0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
9dc0: 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(&journal);. 
9dd0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
9de0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9df0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9e00: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9e10: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
9e20: 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26   zMasterPtr!=0 &
9e30: 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
9e40: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
9e50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9e60: 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29  Free(zMasterPtr)
9e70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
9e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9e90: 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
9ea0: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
9eb0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9ec0: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
9ed0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9ee0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9ef0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
9f00: 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74   zJournal += (st
9f10: 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  rlen(zJournal)+1
9f20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
9f30: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
9f40: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c  e(zMaster);..del
9f50: 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
9f60: 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
9f70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
9f80: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
9f90: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
9fa0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
9fb0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9fc0: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(&master);.  }.
9fd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9fe0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79  /*.** Make every
9ff0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
a000: 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68  he agree with wh
a010: 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20  at is on disk.  
a020: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
a030: 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69  ** reread the di
a040: 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  sk to reset the 
a050: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63  state of the cac
a060: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
a070: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a080: 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63   after a rollbac
a090: 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20  k in which some 
a0a0: 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63  of the dirty cac
a0b0: 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20  he.** pages had 
a0c0: 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
a0d0: 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  en out to disk. 
a0e0: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
a0f0: 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63   back the.** cac
a100: 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  he content and t
a110: 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
a120: 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20  o do that is to 
a130: 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63  reread the old c
a140: 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66  ontent.** back f
a150: 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f  rom the disk..*/
a160: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
a170: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50  r_reload_cache(P
a180: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a190: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
a1a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a1b0: 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  K;.  for(pPg=pPa
a1c0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
a1d0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
a1e0: 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  l){.    char zBu
a1f0: 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  f[SQLITE_MAX_PAG
a200: 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28  E_SIZE];.    if(
a210: 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63   !pPg->dirty ) c
a220: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
a230: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
a240: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
a250: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  bSize ){.      r
a260: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
a270: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  k(pPager->fd, pP
a280: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
a290: 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
a2a0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
a2b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a2c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a2d0: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
a2e0: 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
a2f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
a310: 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20  CE3("REFETCH %d 
a320: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
a330: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
a340: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
a350: 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
a360: 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
a370: 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67  r, zBuf, pPg->pg
a380: 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73  no, 2);.    }els
a390: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
a3a0: 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d  zBuf, 0, pPager-
a3b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a3c0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
a3d0: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
a3e0: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
a3f0: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
a400: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
a410: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
a420: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a430: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
a440: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
a450: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
a460: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
a470: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a480: 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
a490: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
a4a0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
a4b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
a4c0: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
a4d0: 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
a4e0: 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
a4f0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra);.      }. 
a500: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65     }.    pPg->ne
a510: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
a520: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
a530: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
a540: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
a550: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
a560: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
a570: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
a580: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a590: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
a5a0: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
a5b0: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
a5c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
a5d0: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
a5e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a5f0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
a600: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
a610: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  nt nPage){.  ass
a620: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
a630: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
a640: 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  IVE );.  return 
a650: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a660: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
a670: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
a680: 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f  i64)nPage);.}../
a690: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
a6a0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
a6b0: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
a6c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
a6d0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
a6e0: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
a6f0: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
a700: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
a710: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
a720: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
a730: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
a740: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
a750: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
a760: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
a770: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
a780: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
a790: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
a7a0: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
a7b0: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
a7c0: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
a7d0: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
a7e0: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
a7f0: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
a800: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
a810: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
a820: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
a830: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
a840: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
a850: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
a860: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
a870: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
a880: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
a890: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
a8a0: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
a8b0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
a8c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
a8d0: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
a8e0: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
a8f0: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
a900: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
a910: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
a920: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
a930: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
a940: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
a950: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
a960: 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
a970: 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
a980: 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
a990: 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
a9a0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
a9b0: 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73  **  (6)  N bytes
a9c0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
a9d0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
a9e0: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
a9f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
aa00: 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
aa10: 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
aa20: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
aa30: 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
aa40: 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
aa50: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
aa60: 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
aa70: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
aa90: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
aaa0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
aab0: 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
aac0: 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f  .**  (7)  Zero o
aad0: 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
aae0: 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
aaf0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
ab00: 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
ab10: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
ab20: 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
ab30: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
ab40: 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
ab50: 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
ab60: 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
ab70: 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
ab80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
ab90: 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
aba0: 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   6 items above..
abb0: 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
abc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
abd0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
abe0: 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 7th item..**.
abf0: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
ac00: 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
ac10: 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
ac20: 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
ac30: 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
ac40: 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
ac50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
ac60: 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
ac70: 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
ac80: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
ac90: 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
aca0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
acb0: 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
acc0: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
acd0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
ace0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
acf0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
ad00: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
ad10: 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
ad20: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
ad30: 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
ad40: 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
ad50: 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
ad60: 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
ad70: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
ad80: 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
ad90: 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
ada0: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
adb0: 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
adc0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
add0: 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
ade0: 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
adf0: 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
ae00: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
ae10: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
ae20: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
ae30: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
ae40: 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
ae50: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
ae60: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
ae70: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
ae80: 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
ae90: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
aea0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
aeb0: 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
aec0: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
aed0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
aee0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
aef0: 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
af00: 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
af10: 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
af20: 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
af30: 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
af40: 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
af50: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
af60: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
af70: 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
af80: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
af90: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
afa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
afb0: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
afc0: 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
afd0: 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
afe0: 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
aff0: 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
b000: 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
b010: 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
b020: 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
b030: 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
b040: 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
b050: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
b060: 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
b070: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
b080: 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
b090: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
b0a0: 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
b0b0: 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
b0c0: 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
b0d0: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
b0e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
b0f0: 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
b100: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
b110: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
b120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b130: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
b140: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b150: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
b160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b170: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b180: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
b190: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b1b0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
b1c0: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
b1d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b1f0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b200: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
b210: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
b220: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
b230: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
b240: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
b270: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
b280: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
b290: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
b2a0: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
b2b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
b2c0: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
b2d0: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
b2e0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
b2f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
b300: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
b310: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
b320: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
b330: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
b340: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
b350: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
b360: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
b370: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
b380: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b390: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
b3a0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
b3b0: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
b3c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
b3d0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b3e0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
b3f0: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
b400: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b410: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
b420: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
b430: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
b440: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
b450: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
b460: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
b470: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
b480: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
b490: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
b4a0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
b4b0: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
b4c0: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
b4d0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
b4e0: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
b4f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
b500: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
b510: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
b520: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
b530: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
b540: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
b550: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
b560: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
b570: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b580: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
b590: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
b5a0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
b5b0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
b5c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b5d0: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
b5e0: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
b5f0: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
b600: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
b610: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
b620: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
b630: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
b640: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
b650: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
b660: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
b670: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
b680: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
b690: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
b6a0: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
b6b0: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
b6c0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
b6d0: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
b6e0: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
b6f0: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
b700: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
b710: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
b720: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
b730: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
b740: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
b750: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
b760: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
b770: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
b780: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
b790: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
b7a0: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
b7b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b7c0: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
b7d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
b7e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
b7f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b800: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
b810: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
b820: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
b830: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
b840: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
b850: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
b860: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
b870: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
b880: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
b890: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
b8a0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
b8b0: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
b8c0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
b8d0: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
b8e0: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
b8f0: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
b900: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
b910: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
b920: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
b930: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b940: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
b950: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
b960: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b970: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
b980: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
b990: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
b9a0: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
b9b0: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
b9c0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
b9d0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
b9e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
b9f0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
ba00: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ba10: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
ba20: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
ba30: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
ba40: 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  t's original siz
ba50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
ba60: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
ba70: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
ba80: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
ba90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
baa0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
bab0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
bac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bad0: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
bae0: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
baf0: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
bb00: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
bb10: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
bb20: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
bb30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bb40: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
bb50: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
bb60: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
bb70: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
bb80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bb90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
bba0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
bbb0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
bbc0: 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20  Pager)); */.    
bbd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bbe0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  K ) goto end_pla
bbf0: 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a  yback;.  .    /*
bc00: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
bc10: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
bc20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
bc30: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
bc40: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
bc50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
bc60: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
bc70: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
bc80: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
bc90: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
bca0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
bcb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bcc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
bcd0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
bce0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
bcf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
bd00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
bd10: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
bd20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
bd40: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
bd50: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
bd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bd70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61    }.  }..  /* Pa
bd80: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ges that have be
bd90: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
bda0: 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65  e journal but ne
bdb0: 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  ver synced.  ** 
bdc0: 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72  where not restor
bdd0: 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61  ed by the loop a
bde0: 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74  bove.  We have t
bdf0: 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a  o restore those.
be00: 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65    ** pages by re
be10: 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20  ading them back 
be20: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
be30: 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  l database..  */
be40: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
be50: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61  QLITE_OK );.  pa
be60: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
be70: 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70  (pPager);..end_p
be80: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
be90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bea0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
beb0: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
bec0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
bed0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
bee0: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
bef0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
bf00: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
bf10: 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c  ill return true,
bf20: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
bf30: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
bf40: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
bf50: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
bf60: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
bf70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bf80: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
bf90: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
bfa0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bfb0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
bfc0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
bfd0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
bfe0: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
bff0: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
c000: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
c010: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
c020: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
c030: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
c040: 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54  erent PAGER_SECT
c050: 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c  OR_SIZE.  ** val
c060: 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
c070: 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
c080: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
c090: 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ss..  */.  pPage
c0a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
c0b0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
c0c0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  E;.  return rc;.
c0d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
c0e0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
c0f0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
c100: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
c110: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
c120: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
c130: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
c140: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
c150: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
c160: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
c170: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
c180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
c190: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
c1a0: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
c1b0: 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
c1c0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
c1d0: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
c1e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
c1f0: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
c200: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
c210: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
c220: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
c230: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c240: 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
c250: 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
c260: 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
c270: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
c280: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
c290: 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
c2a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
c2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c2c0: 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
c2d0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
c2e0: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c300: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
c310: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
c320: 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
c330: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
c340: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c350: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
c360: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c380: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
c390: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
c3a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c3b0: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
c3c0: 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
c3d0: 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
c3e0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
c3f0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
c400: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
c410: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c420: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c430: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
c440: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
c450: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
c460: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
c470: 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73  fset to the firs
c480: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c490: 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68   written.  ** th
c4a0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
c4b0: 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65  nsaction, or the
c4c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c4d0: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
c4e0: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
c4f0: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
c500: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
c510: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
c520: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
c530: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
c540: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
c550: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
c560: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20   = szJ;.  }.  . 
c570: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
c580: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
c590: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
c5a0: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ize..  */.  if( 
c5b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
c5c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
c5d0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c5e0: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
c5f0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
c600: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c610: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
c620: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
c630: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
c640: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
c650: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
c660: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
c670: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
c680: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
c690: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
c6a0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
c6b0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
c6c0: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
c6d0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
c6e0: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
c6f0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
c700: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
c710: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
c720: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
c730: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
c740: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
c750: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c760: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
c770: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
c780: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
c790: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
c7a0: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
c7b0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
c7c0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
c7d0: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
c7e0: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
c7f0: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
c800: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
c810: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
c820: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
c830: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
c840: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
c850: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c860: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
c870: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
c880: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72  .  }..  /* Now r
c890: 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62  oll some pages b
c8a0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61  ack from the tra
c8b0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c8c0: 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a  . Pager.stmtJSiz
c8d0: 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73  e.  ** was the s
c8e0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
c8f0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  al file when thi
c900: 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  s statement was 
c910: 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a  started, so.  **
c920: 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65   everything afte
c930: 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  r that needs to 
c940: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  be rolled back, 
c950: 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a  either into the.
c960: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
c970: 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c  he memory cache,
c980: 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
c990: 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   ** If it is not
c9a0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65   zero, then Page
c9b0: 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20  r.stmtHdrOff is 
c9c0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c9d0: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
c9e0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
c9f0: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
ca00: 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61   during this sta
ca10: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ca20: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
ca30: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
ca40: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
ca50: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
ca60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ca70: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
ca80: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
ca90: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
caa0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
cab0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
cac0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
cad0: 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
cae0: 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72  mtCksum;.  asser
caf0: 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  t( JOURNAL_HDR_S
cb00: 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67 65  Z(pPager)<(pPage
cb10: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29  r->pageSize+8) )
cb20: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
cb30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d  r->journalOff <=
cb40: 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72   (hdrOff-(pPager
cb50: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29  ->pageSize+8)) )
cb60: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
cb70: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
cb80: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
cb90: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
cba0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
cbb0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
cbc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cbd0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
cbe0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
cbf0: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
cc00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
cc10: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65  J ){.    u32 nRe
cc20: 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  c;.    u32 dummy
cc30: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
cc40: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
cc50: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64  , szJ, &nRec, &d
cc60: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
cc70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cc80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
cc90: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
cca0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
ccb0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
ccc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
ccd0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  c==0 ){.      nR
cce0: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
ccf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
cd00: 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
cd10: 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
cd20: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
cd30: 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
cd40: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
cd50: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
cd60: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
cd70: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
cd80: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
cd90: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
cda0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
cdb0: 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
cdc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
cdd0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
cde0: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
cdf0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
ce00: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
ce10: 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
ce20: 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ck:.  if( rc!=SQ
ce30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ce40: 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
ce50: 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 43  pPager, SQLITE_C
ce60: 4f 52 52 55 50 54 29 3b 0a 20 20 7d 65 6c 73 65  ORRUPT);.  }else
ce70: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
ce80: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
ce90: 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
cea0: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
ceb0: 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
cec0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ced0: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
cee0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
cef0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
cf00: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
cf10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
cf20: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
cf30: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
cf40: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
cf50: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
cf60: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
cf70: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
cf80: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
cf90: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a  r->mxPage = 10;.
cfa0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a    }.}../*.** Adj
cfb0: 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
cfc0: 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
cfd0: 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
cfe0: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
cff0: 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
d000: 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
d010: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
d020: 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
d030: 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
d040: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
d050: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
d060: 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
d070: 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
d080: 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
d090: 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
d0a0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
d0b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
d0c0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
d0d0: 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
d0e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
d0f0: 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
d100: 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
d110: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
d120: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
d130: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
d140: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
d150: 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
d160: 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
d170: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d180: 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
d190: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
d1a0: 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
d1b0: 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
d1c0: 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
d1d0: 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
d1e0: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
d1f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
d210: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
d220: 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
d230: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d240: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d250: 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
d260: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
d270: 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
d280: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
d290: 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
d2a0: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
d2b0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
d2c0: 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
d2d0: 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
d2e0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
d2f0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
d300: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
d310: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
d320: 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
d330: 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
d340: 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
d350: 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
d360: 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
d370: 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
d390: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
d3a0: 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
d3b0: 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
d3c0: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
d3d0: 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
d3e0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
d3f0: 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
d400: 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
d410: 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
d420: 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
d430: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
d440: 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
d450: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
d460: 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
d470: 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
d480: 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
d490: 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
d4a0: 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
d4b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d4c0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
d4d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
d4e0: 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76  r_set_safety_lev
d4f0: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
d500: 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20  , int level){.  
d510: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
d520: 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
d530: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
d540: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
d550: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
d560: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
d570: 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
d580: 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
d590: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
d5a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
d5b0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
d5c0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
d5d0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
d5e0: 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
d5f0: 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
d600: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
d610: 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
d620: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
d630: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
d640: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
d650: 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  nly.  .*/.int sq
d660: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
d670: 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  ount = 0;../*.**
d680: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
d690: 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  y file.  Write t
d6a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
d6b0: 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a  ile into zFile.*
d6c0: 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65  * (zFile must be
d6d0: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
d6e0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62  _TEMPNAME_SIZE b
d6f0: 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69  ytes long.)  Wri
d700: 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  te.** the file d
d710: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
d720: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
d730: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
d740: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
d750: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
d760: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
d770: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
d780: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
d790: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
d7a0: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
d7b0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
d7c0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61  ic int sqlite3pa
d7d0: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
d7e0: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
d7f0: 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63   **pFd){.  int c
d800: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
d810: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
d820: 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
d830: 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
d840: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
d850: 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  only */.  do{.  
d860: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
d870: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
d880: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
d890: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
d8a0: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
d8b0: 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68  , pFd, 1);.  }wh
d8c0: 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63  ile( cnt>0 && rc
d8d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
d8e0: 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
d8f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d900: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d910: 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
d920: 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
d930: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
d940: 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
d950: 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
d960: 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
d970: 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
d980: 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
d990: 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
d9a0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
d9b0: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
d9c0: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
d9d0: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
d9e0: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
d9f0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
da00: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
da10: 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
da20: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
da30: 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
da40: 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
da50: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
da60: 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
da70: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
da80: 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
da90: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
daa0: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
dab0: 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
dac0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
dad0: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
dae0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
daf0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
db00: 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
db10: 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
db20: 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
db30: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
db40: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
db50: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
db60: 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
db70: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a  ite3pager_open(.
db80: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
db90: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
dba0: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
dbb0: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
dbc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dbd0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
dbe0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
dbf0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
dc00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
dc10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
dc20: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
dc30: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
dc40: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
dc50: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
dc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
dc70: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
dc80: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
dc90: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
dca0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   0;.  char *zFul
dcb0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
dcc0: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f   int nameLen;  /
dcd0: 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72  * Compiler is wr
dce0: 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ong. This is alw
dcf0: 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
dd00: 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20  before use */.  
dd10: 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e  OsFile *fd;.  in
dd20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
dd30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
dd40: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
dd50: 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
dd60: 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
dd70: 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
dd80: 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
dd90: 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
dda0: 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
ddb0: 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
ddc0: 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
ddd0: 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61  DLOCK)!=0;.  cha
dde0: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
ddf0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23  EMPNAME_SIZE];.#
de00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
de10: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
de20: 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c  EMENT.  /* A mal
de30: 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  loc() cannot fai
de40: 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65  l in sqlite3Thre
de50: 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20  adData() as one 
de60: 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
de70: 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20   .  ** malloc() 
de80: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
de90: 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74  y been made by t
dea0: 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72  his thread befor
deb0: 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74  e it gets.  ** t
dec0: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68  o this point. Th
ded0: 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72  is means the Thr
dee0: 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76  eadData must hav
def0: 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
df00: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f   already.  ** so
df10: 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
df20: 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73  .nAlloc can be s
df30: 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20  et. It would be 
df40: 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20  nice to assert. 
df50: 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64 44   ** that ThreadD
df60: 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f  ata.nAlloc is no
df70: 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73  n-zero, but alas
df80: 20 74 68 69 73 20 62 72 65 61 6b 73 20 74 65 73   this breaks tes
df90: 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72  t cases .  ** wr
dfa0: 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20  itten to invoke 
dfb0: 74 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74  the pager direct
dfc0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61  ly..  */.  Threa
dfd0: 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
dfe0: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
dff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73  );.  assert( pTs
e000: 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  d );.#endif..  /
e010: 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61  * If malloc() ha
e020: 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64  s already failed
e030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e040: 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76 65  OMEM. Before eve
e050: 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 66  n.  ** testing f
e060: 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70 70  or this, set *pp
e070: 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f  Pager to NULL so
e080: 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77   the caller know
e090: 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  s the pager.  **
e0a0: 20 73 74 72 75 63 74 75 72 65 20 77 61 73 20 6e   structure was n
e0b0: 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20  ever allocated. 
e0c0: 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  .  */.  *ppPager
e0d0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
e0e0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
e0f0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e100: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e110: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20  }.  memset(&fd, 
e120: 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a  0, sizeof(fd));.
e130: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
e140: 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65  ager file and se
e150: 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t zFullPathname 
e160: 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c  to point at mall
e170: 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d  oc()ed .  ** mem
e180: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
e190: 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65  he complete file
e1a0: 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75  name (i.e. inclu
e1b0: 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  ding the directo
e1c0: 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ry)..  */.  if( 
e1d0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
e1e0: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66  lename[0] ){.#if
e1f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e200: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
e210: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
e220: 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
e230: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
e240: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c   = 1;.      zFul
e250: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e260: 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20  teStrDup("");.  
e270: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
e280: 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c     {.      zFull
e290: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e2a0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e2b0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
e2c0: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
e2d0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
e2e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e2f0: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
e300: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
e310: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
e320: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
e330: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
e340: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
e350: 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  p(zTemp, &fd);. 
e360: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
e370: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
e380: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e390: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e3a0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
e3b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e3c0: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
e3d0: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
e3e0: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
e3f0: 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
e400: 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f  cture. As part o
e410: 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63  f the same alloc
e420: 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a  ation, allocate.
e430: 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
e440: 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66  he full paths of
e450: 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63   the file, direc
e460: 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  tory and journal
e470: 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46   .  ** (Pager.zF
e480: 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a  ilename, Pager.z
e490: 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61  Directory and Pa
e4a0: 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20  ger.zJournal).. 
e4b0: 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50   */.  if( zFullP
e4c0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e  athname ){.    n
e4d0: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
e4e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e4f0: 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
e500: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
e510: 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
e520: 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
e530: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
e540: 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
e550: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
e560: 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65  ocks above, free
e570: 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a   the memory .  *
e580: 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
e590: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66  zFullPathname, f
e5a0: 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ree the Pager st
e5b0: 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
e5c0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65  e the .  ** file
e5d0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
e5e0: 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  r is not allocat
e5f0: 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ed there is no n
e600: 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a  eed to set .  **
e610: 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61   any Pager.errMa
e620: 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  sk variables..  
e630: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  */.  if( !pPager
e640: 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61   || !zFullPathna
e650: 6d 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  me || rc!=SQLITE
e660: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
e670: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
e680: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
e690: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e6a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
e6b0: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
e6c0: 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
e6d0: 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
e6e0: 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43  rc);.  }..  TRAC
e6f0: 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
e700: 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
e710: 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  fd), zFullPathna
e720: 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  me);.  pPager->z
e730: 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
e740: 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
e750: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e760: 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46  ry = &pPager->zF
e770: 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b  ilename[nameLen+
e780: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
e790: 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
e7a0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d  ->zDirectory[nam
e7b0: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70  eLen+1];.  strcp
e7c0: 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
e7d0: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
e7e0: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50  me);.  strcpy(pP
e7f0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
e800: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e810: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  ;..  for(i=nameL
e820: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
e830: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
e840: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
e850: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
e860: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
e870: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
e880: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
e890: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
e8a0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
e8b0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e8c0: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
e8d0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
e8e0: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
e8f0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
e900: 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65  = fd;.  /* pPage
e910: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
e920: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
e930: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
e940: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
e950: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
e960: 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
e970: 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
e980: 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
e990: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
e9a0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
e9b0: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
e9c0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
e9d0: 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
e9e0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
e9f0: 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
ea00: 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54  pageSize = SQLIT
ea10: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
ea20: 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  IZE;.  /* pPager
ea30: 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
ea40: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
ea50: 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
ea60: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
ea70: 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Page = 0; */.  /
ea80: 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  * pPager->nMaxPa
ea90: 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
eaa0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
eab0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  0;.  assert( PAG
eac0: 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a  ER_UNLOCK==0 );.
ead0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
eae0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
eaf0: 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  K; */.  /* pPage
eb00: 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
eb10: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
eb20: 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
eb30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
eb40: 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61  b = memDb;.  pPa
eb50: 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ger->readOnly = 
eb60: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
eb70: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
eb80: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
eb90: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
eba0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
ebb0: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
ebc0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
ebd0: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
ebe0: 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ?0:1);.  /* pPag
ebf0: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
ec00: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
ec10: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
ec20: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
ec30: 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
ec40: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
ec50: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
ec60: 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50  NT(nExtra);.  pP
ec70: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
ec80: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
ec90: 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65  SIZE;.  /* pPage
eca0: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
ecb0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d  = 0; */.  /* mem
ecc0: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
ecd0: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
ece0: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
ecf0: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
ed00: 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  ager;.#ifdef SQL
ed10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
ed20: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70  Y_MANAGEMENT.  p
ed30: 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Pager->pNext = p
ed40: 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70  Tsd->pPager;.  p
ed50: 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  Tsd->pPager = pP
ed60: 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ager;.#endif.  r
ed70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ed80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ed90: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
eda0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
edb0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
edc0: 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61  t_busyhandler(Pa
edd0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
ede0: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
edf0: 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
ee00: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
ee10: 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
ee20: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
ee30: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
ee40: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
ee50: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
ee60: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
ee70: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
ee80: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
ee90: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
eea0: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
eeb0: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
eec0: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
eed0: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
eee0: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
eef0: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
ef00: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
ef10: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
ef20: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
ef30: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
ef40: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
ef50: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
ef60: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
ef70: 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67  ed by sqlite3pag
ef80: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  er_unref()..*/.v
ef90: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
efa0: 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28  _set_destructor(
efb0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
efc0: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69  oid (*xDesc)(voi
efd0: 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  d*,int)){.  pPag
efe0: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
eff0: 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
f000: 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
f010: 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
f020: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
f030: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
f040: 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
f050: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
f060: 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
f070: 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
f080: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
f090: 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
f0a0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
f0b0: 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
f0c0: 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
f0d0: 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
f0e0: 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
f0f0: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
f100: 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
f110: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
f120: 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
f130: 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
f140: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
f150: 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  reiniter(Pager *
f160: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
f170: 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e  Reinit)(void*,in
f180: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
f190: 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
f1a0: 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
f1b0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20   the page size. 
f1c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20   Return the new 
f1d0: 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75  size.  If the su
f1e0: 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a  ggest new page.*
f1f0: 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72  * size is inappr
f200: 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e  opriate, then an
f210: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
f220: 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74  e size is select
f230: 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  ed.** and return
f240: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
f250: 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e3pager_set_page
f260: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
f270: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
f280: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
f290: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
f2a0: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
f2b0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
f2c0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
f2d0: 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
f2e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
f2f0: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72  ageSize;.  }.  r
f300: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61  eturn pPager->pa
f310: 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
f320: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
f330: 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
f340: 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
f350: 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
f360: 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
f370: 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
f380: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
f390: 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
f3a0: 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
f3b0: 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
f3c0: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
f3d0: 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
f3e0: 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
f3f0: 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
f400: 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
f410: 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
f420: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
f430: 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
f440: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
f450: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
f460: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
f470: 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
f480: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f490: 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
f4a0: 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
f4b0: 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
f4c0: 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71  io_error(){.  sq
f4d0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
f4e0: 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64  it = 0;.}.void d
f4f0: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
f500: 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
f510: 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
f520: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f530: 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
f540: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
f550: 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
f560: 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
f570: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
f580: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
f590: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
f5a0: 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
f5b0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65  lse.# define cle
f5c0: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
f5d0: 65 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65  error().# define
f5e0: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
f5f0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
f600: 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
f610: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f620: 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
f630: 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
f640: 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
f650: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
f660: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
f670: 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
f680: 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
f690: 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68  *.** No error ch
f6a0: 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20  ecking is done. 
f6b0: 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72  The rational for
f6c0: 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
f6d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
f6e0: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76  may be called ev
f6f0: 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  en if the file d
f700: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
f710: 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65   contain a heade
f720: 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20  r. In .** these 
f730: 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52  cases sqlite3OsR
f740: 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72  ead() will retur
f750: 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77  n an error, to w
f760: 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74  hich the correct
f770: 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73   .** response is
f780: 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d   to zero the mem
f790: 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64  ory at pDest and
f7a0: 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65   continue.  A re
f7b0: 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  al IO error .** 
f7c0: 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20  will presumably 
f7d0: 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63  recur and be pic
f7e0: 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f  ked up later (To
f7f0: 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  do: Think about 
f800: 74 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  this)..*/.void s
f810: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64  qlite3pager_read
f820: 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  _fileheader(Page
f830: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
f840: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
f850: 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65  *pDest){.  memse
f860: 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
f870: 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
f880: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  {.    sqlite3OsS
f890: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
f8a0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  0);.    sqlite3O
f8b0: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
f8c0: 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20  , pDest, N);.   
f8d0: 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64   clear_simulated
f8e0: 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d  _io_error();.  }
f8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f900: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
f910: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
f920: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
f930: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
f940: 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
f950: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
f960: 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
f970: 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
f980: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
f990: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
f9a0: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
f9b0: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
f9c0: 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
f9d0: 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
f9e0: 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
f9f0: 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
fa00: 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
fa10: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
fa20: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
fa30: 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
fa40: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
fa50: 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
fa60: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
fa70: 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
fa80: 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  er){.  i64 n;.  
fa90: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
faa0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
fab0: 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
fac0: 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
fad0: 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
fae0: 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   {.    if( sqlit
faf0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
fb00: 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51  ger->fd, &n)!=SQ
fb10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fb20: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
fb30: 67 65 72 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ger, SQLITE_IOER
fb40: 52 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  R);.      return
fb50: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
fb60: 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
fb70: 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
fb80: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
fb90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
fba0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
fbb0: 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
fbc0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
fbd0: 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
fbe0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
fbf0: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d  bSize = n;.    }
fc00: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50  .  }.  if( n==(P
fc10: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
fc20: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
fc30: 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
fc40: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
fc50: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
fc60: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
fc70: 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
fc80: 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a  (Pager*);.../*.*
fc90: 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
fca0: 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
fcb0: 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20  n. Also set the 
fcc0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30  page number to 0
fcd0: 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
fce0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
fcf0: 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79   not part of any
fd00: 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69   hash chain. Thi
fd10: 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
fd20: 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c  cause the.** sql
fd30: 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61  ite3pager_movepa
fd40: 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e  ge() routine can
fd50: 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e   leave a page in
fd60: 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72   the .** pNextFr
fd70: 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73  ee/pPrevFree lis
fd80: 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
fd90: 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
fda0: 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69  -chain..*/.stati
fdb0: 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73  c void unlinkHas
fdc0: 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50  hChain(Pager *pP
fdd0: 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
fde0: 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  ){.  if( pPg->pg
fdf0: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  no==0 ){.    /* 
fe00: 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
fe10: 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  er is zero, then
fe20: 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f   this page is no
fe30: 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63 68  t in any hash ch
fe40: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ain. */.    retu
fe50: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rn;.  }.  if( pP
fe60: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
fe70: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
fe80: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
fe90: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
fea0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
feb0: 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
fec0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
fed0: 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68  aHash[pager_hash
fee0: 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50  (pPg->pgno)]!=pP
fef0: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
ff00: 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61  revHash->pNextHa
ff10: 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  sh = pPg->pNextH
ff20: 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ash;.  }else{.  
ff30: 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72 5f    int h = pager_
ff40: 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b  hash(pPg->pgno);
ff50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ff60: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70  ger->aHash[h]==p
ff70: 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
ff80: 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
ff90: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
ffa0: 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  ..  pPg->pgno = 
ffb0: 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
ffc0: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
ffd0: 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
ffe0: 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
fff0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
10000 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
10010 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
10020 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
10030 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
10040 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
10050 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
10060 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
10070 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
10080 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
10090 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  ager;..  /* Keep
100a0 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65   the pFirstSynce
100b0 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  d pointer pointi
100c0 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ng at the first 
100d0 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67  synchronized pag
100e0 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d  e */.  if( pPg==
100f0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
10100 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
10110 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
10120 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65  tFree;.    while
10130 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
10140 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
10150 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50  xtFree; }.    pP
10160 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10170 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = p;.  }..  /
10180 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
10190 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
101a0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
101b0 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
101c0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
101d0 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
101e0 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
101f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10200 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
10210 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  ;.    pPager->pF
10220 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
10230 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28  tFree;.  }.  if(
10240 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
10250 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
10260 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
10270 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
10280 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
10290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
102a0 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
102b0 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
102c0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
102d0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
102e0 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  xtFree = pPg->pP
102f0 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  revFree = 0;..  
10300 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
10310 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
10320 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  le */.  unlinkHa
10330 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
10340 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pPg);.}..#ifndef
10350 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
10360 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORYDB./*.** This
10370 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
10380 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20   to truncate an 
10390 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
103a0 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61  se.  Delete.** a
103b0 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
103c0 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68  gno is larger th
103d0 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
103e0 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
103f0 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65  enced..** Refere
10400 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
10410 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
10420 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
10430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10440 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
10450 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
10460 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
10470 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
10480 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
10490 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
104a0 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
104b0 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
104c0 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
104d0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
104e0 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
104f0 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
10500 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
10510 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
10520 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
10530 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
10540 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
10550 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
10560 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
10570 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
10580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
10590 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
105a0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69  tAll;.      unli
105b0 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
105c0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
105d0 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
105e0 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
105f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
10600 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63  fine memoryTrunc
10610 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f  ate(p).#endif../
10620 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
10630 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
10640 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
10650 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
10660 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
10670 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
10680 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
10690 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
106a0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
106b0 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
106c0 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
106d0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
106e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
106f0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
10700 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
10710 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
10720 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
10730 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
10740 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
10750 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
10760 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
10770 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 50   rc;.  assert( P
10780 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
10790 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
107a0 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
107b0 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
107c0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
107d0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
107e0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
107f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
10800 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
10810 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  e ){.    rc = SQ
10820 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
10830 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
10840 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
10850 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
10860 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d  locktype);.    }
10870 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
10880 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65  E_BUSY && sqlite
10890 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
108a0 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
108b0 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20  Handler) );.    
108c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
108d0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
108e0 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74  r->state = lockt
108f0 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ype;.    }.  }. 
10900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10910 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
10920 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75  e file to the nu
10930 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70  mber of pages sp
10940 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ecified..*/.int 
10950 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
10960 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
10970 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
10980 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
10990 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
109a0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
109b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
109c0 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
109d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
109e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
109f0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
10a00 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
10a10 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
10a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10a30 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  K;.  }.  if( MEM
10a40 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
10a50 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
10a60 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
10a70 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
10a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10a90 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OK;.  }.  rc = s
10aa0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
10ab0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
10ac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
10ad0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
10ae0 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75   /* Get an exclu
10af0 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
10b00 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
10b10 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a   truncating. */.
10b20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
10b30 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
10b40 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
10b50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10b60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10b70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10b80 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
10b90 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67  ate(pPager, nPag
10ba0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
10bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
10bc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
10bd0 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nPage;.  }.  ret
10be0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10bf0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
10c00 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
10c10 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
10c20 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
10c30 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
10c40 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
10c50 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
10c60 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10c70 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
10c80 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
10c90 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
10ca0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
10cb0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
10cc0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
10cd0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
10ce0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
10cf0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
10d00 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
10d10 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
10d20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
10d30 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
10d40 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
10d50 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
10d60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10d70 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
10d80 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
10d90 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
10da0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
10db0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
10dc0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
10dd0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
10de0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
10df0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
10e00 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
10e10 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
10e20 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
10e30 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
10e40 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
10e50 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50  te3pager_close(P
10e60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
10e70 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
10e80 65 78 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ext;.#ifdef SQLI
10e90 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
10ea0 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
10eb0 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
10ec0 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
10ed0 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
10ee0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
10ef0 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
10f00 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
10f10 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
10f20 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
10f30 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
10f40 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
10f50 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
10f60 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
10f70 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
10f80 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
10f90 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
10fa0 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
10fb0 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  n be set..  */. 
10fc0 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
10fd0 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
10fe0 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
10ff0 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61  t( pPager );.  a
11000 73 73 65 72 74 28 20 70 54 73 64 20 26 26 20 70  ssert( pTsd && p
11010 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23  Tsd->nAlloc );.#
11020 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28  endif..  switch(
11030 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29   pPager->state )
11040 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
11050 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63  _RESERVED:.    c
11060 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ase PAGER_SYNCED
11070 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  : .    case PAGE
11080 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20  R_EXCLUSIVE: {. 
11090 20 20 20 20 20 2f 2a 20 57 65 20 69 67 6e 6f 72       /* We ignor
110a0 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 73 20  e any IO errors 
110b0 74 68 61 74 20 6f 63 63 75 72 20 64 75 72 69 6e  that occur durin
110c0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20  g the rollback. 
110d0 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f       ** operatio
110e0 6e 2e 20 53 6f 20 64 69 73 61 62 6c 65 20 49 4f  n. So disable IO
110f0 20 65 72 72 6f 72 20 73 69 6d 75 6c 61 74 69 6f   error simulatio
11100 6e 20 73 6f 20 74 68 61 74 20 74 65 73 74 69 6e  n so that testin
11110 67 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 6b 73  g.      ** works
11120 20 6d 6f 72 65 20 65 61 73 69 6c 79 2e 0a 20 20   more easily..  
11130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 69 73      */.      dis
11140 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
11150 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
11160 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
11170 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
11180 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  .      enable_si
11190 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
111a0 73 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  s();.      if( !
111b0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
111c0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
111d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
111e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
111f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
11200 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
11210 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11220 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
11230 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11240 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52   case PAGER_SHAR
11250 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ED: {.      if( 
11260 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
11270 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
11280 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
11290 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
112a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
112b0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
112c0 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
112d0 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
112e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
112f0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
11300 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
11310 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66  =pNext){.#ifndef
11320 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28 20   NDEBUG.    if( 
11330 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
11340 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
11350 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
11360 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
11370 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
11380 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
11390 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
113a0 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
113b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
113c0 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
113d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
113e0 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
113f0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
11400 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
11410 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f   }.  TRACE2("CLO
11420 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
11430 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73  D(pPager));.  as
11440 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
11450 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
11460 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
11470 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
11480 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
11490 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
114a0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
114b0 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
114c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
114d0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
114e0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
114f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11500 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
11510 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
11520 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
11530 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
11540 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
11550 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
11560 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
11570 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
11580 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
11590 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
115a0 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
115b0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
115c0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
115d0 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66  * }.  */..#ifdef
115e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
115f0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
11600 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
11610 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20   pager from the 
11620 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
11630 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  agers starting a
11640 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61  t .  ** ThreadDa
11650 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d  ta.pPager if mem
11660 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
11670 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a  s enabled..  */.
11680 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54    if( pPager==pT
11690 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  sd->pPager ){.  
116a0 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
116b0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
116c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67    }else{.    Pag
116d0 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f  er *pTmp;.    fo
116e0 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70  r(pTmp = pTsd->p
116f0 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65  Pager; pTmp->pNe
11700 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70  xt!=pPager; pTmp
11710 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 3b 0a 20  =pTmp->pNext);. 
11720 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d     pTmp->pNext =
11730 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
11740 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
11750 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
11760 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11770 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
11780 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
11790 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
117a0 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
117b0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61  /.Pgno sqlite3pa
117c0 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76  ger_pagenumber(v
117d0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
117e0 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54  gHdr *p = DATA_T
117f0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
11800 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
11810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
11820 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69  age_ref() functi
11830 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  on increments th
11840 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
11850 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a  t for a page..**
11860 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
11870 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
11880 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
11890 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
118a0 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
118b0 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
118c0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
118d0 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20  ** For non-test 
118e0 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
118f0 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74  f() is a macro t
11900 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f  hat calls _page_
11910 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20  ref().** online 
11920 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
11930 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20   count is zero. 
11940 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d   For test system
11950 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s, page_ref().**
11960 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74   is a real funct
11970 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63  ion so that we c
11980 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e  an set breakpoin
11990 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e  ts and trace it.
119a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
119b0 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
119c0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
119d0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
119e0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
119f0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
11a00 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
11a10 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ve it. */.    if
11a20 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67  ( pPg==pPg->pPag
11a30 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11a40 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
11a50 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
11a60 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ree;.      while
11a70 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
11a80 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
11a90 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
11aa0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
11ab0 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
11ac0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
11ad0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
11ae0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
11af0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
11b00 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11b10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11b20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
11b30 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
11b40 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
11b50 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
11b60 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
11b70 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11b80 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11b90 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
11ba0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11bb0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
11bc0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11bd0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
11be0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
11bf0 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
11c00 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
11c10 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
11c20 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63  E_DEBUG.  static
11c30 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50   void page_ref(P
11c40 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20  gHdr *pPg){.    
11c50 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
11c60 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f   ){.      _page_
11c70 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ref(pPg);.    }e
11c80 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11c90 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45  nRef++;.      RE
11ca0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
11cb0 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  }.  }.#else.# de
11cc0 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29  fine page_ref(P)
11cd0 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30     ((P)->nRef==0
11ce0 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76  ?_page_ref(P):(v
11cf0 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29  oid)(P)->nRef++)
11d00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
11d10 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
11d20 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
11d30 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
11d40 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
11d50 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
11d60 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
11d70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11d80 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44  ger_ref(void *pD
11d90 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
11da0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
11db0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67  DR(pData);.  pag
11dc0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
11dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11de0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
11df0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f  e journal.  In o
11e00 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
11e10 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
11e20 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
11e30 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
11e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
11e50 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
11e60 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
11e70 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20  f the.** disk.  
11e80 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
11e90 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69  o modify the ori
11ea0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
11eb0 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a  ile until after.
11ec0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
11ed0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  as been synced. 
11ee0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
11ef0 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64   database is mod
11f00 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ified before.** 
11f10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
11f20 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65  ynced and a powe
11f30 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
11f40 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a  , the unsynced j
11f50 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77  ournal.** data w
11f60 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64  ould be lost and
11f70 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61   we would be una
11f80 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ble to completel
11f90 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a  y rollback the.*
11fa0 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
11fb0 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  es.  Database co
11fc0 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f  rruption would o
11fd0 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  ccur..** .** Thi
11fe0 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75  s routine also u
11ff0 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20  pdates the nRec 
12000 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61  field in the hea
12010 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
12020 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d  al..** (See comm
12030 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ents on the page
12040 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
12050 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
12060 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
12070 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63  ).** If the sync
12080 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74   mode is FULL, t
12090 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63  wo syncs will oc
120a0 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20  cur.  First the 
120b0 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  whole journal.**
120c0 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e   is synced, then
120d0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
120e0 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e  is updated, then
120f0 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f   a second sync o
12100 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ccurs..**.** For
12110 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
12120 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  ases, we do not 
12130 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61  care if we are a
12140 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  ble to rollback.
12150 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  ** after a power
12160 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e   failure, so syn
12170 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
12180 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  This routine cle
12190 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ars the needSync
121a0 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
121b0 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c  page current hel
121c0 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a  d in.** memory..
121d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
121e0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
121f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
12200 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
12210 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
12220 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
12230 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
12240 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
12250 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
12260 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
12270 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
12280 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
12290 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
122a0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
122b0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
122c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
122d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
122e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
122f0 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  pen );.      /* 
12300 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
12310 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f  >noSync ); // no
12320 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65  Sync might be se
12330 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  t if synchronous
12340 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75  .      ** was tu
12350 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74  rned off after t
12360 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
12370 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63  as started.  Tic
12380 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e  ket #615 */.#ifn
12390 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
123a0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   {.        /* Ma
123b0 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67  ke sure the pPag
123c0 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72  er->nRec counter
123d0 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20   we are keeping 
123e0 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a  agrees.        *
123f0 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  * with the nRec 
12400 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
12410 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
12420 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
12430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12440 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  64 jSz;.        
12450 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
12460 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
12470 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20  fd, &jSz);.     
12480 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
12490 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
124a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
124b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53  ->journalOff==jS
124c0 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
124d0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
124e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
124f0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
12500 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12510 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
12520 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
12530 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
12540 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
12550 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
12560 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
12570 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
12580 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
12590 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
125a0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
125b0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
125c0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
125d0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
125e0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
125f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
12600 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
12610 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
12620 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
12630 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
12640 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
12650 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12660 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
12670 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
12680 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
12690 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
126a0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
126b0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
126c0 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20  ger->jfd,.      
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
126f0 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
12700 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
12710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12720 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12730 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
12740 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
12750 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  fd, pPager->nRec
12760 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12770 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
12780 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12790 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
127a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
127b0 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
127c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
127d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
127e0 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
127f0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
12800 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
12810 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72 63  ager));.      rc
12820 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
12830 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
12840 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b  ager->fullSync);
12850 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
12860 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12870 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
12880 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
12890 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
128a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
128b0 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
128c0 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
128d0 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
128e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
128f0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
12900 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
12910 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
12920 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
12930 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
12940 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
12950 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
12960 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
12970 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
12980 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
12990 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
129a0 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
129b0 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
129c0 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
129d0 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
129e0 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
129f0 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
12a00 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
12a10 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
12a20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
12a30 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
12a40 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
12a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12a60 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
12a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
12a80 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
12a90 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
12aa0 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
12ab0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
12ac0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
12ad0 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
12ae0 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
12af0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
12b00 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
12b10 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
12b20 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
12b30 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
12b40 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
12b50 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
12b60 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
12b70 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
12b80 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
12b90 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
12ba0 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
12bb0 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
12bc0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
12bd0 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
12be0 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
12bf0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
12c00 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
12c10 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
12c20 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
12c30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
12c40 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
12c50 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
12c60 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
12c70 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
12c80 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
12c90 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
12ca0 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
12cb0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
12cc0 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
12cd0 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
12ce0 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
12cf0 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
12d00 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
12d10 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
12d20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
12d30 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
12d40 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
12d50 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
12d60 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
12d70 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
12d80 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
12d90 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
12da0 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
12db0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
12dc0 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
12dd0 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
12de0 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
12df0 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
12e00 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
12e10 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
12e20 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
12e30 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
12e40 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
12e50 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
12e60 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
12e70 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
12e80 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
12e90 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
12ea0 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
12eb0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
12ec0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
12ed0 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
12ee0 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
12ef0 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
12f00 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
12f10 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
12f20 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
12f30 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
12f40 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
12f50 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
12f60 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
12f70 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
12f80 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
12f90 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
12fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12fb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12fc0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  }..  while( pLis
12fd0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
12fe0 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
12ff0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13000 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
13010 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
13020 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
13030 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13040 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13050 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  rc;.    /* If th
13060 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
13070 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
13080 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
13090 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
130a0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
130b0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
130c0 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65  eans sqlite3page
130d0 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73  r_truncate() was
130e0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
130f0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
13100 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
13110 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
13120 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
13130 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
13140 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
13150 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
13160 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
13170 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
13180 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43 4f  Size ){.      CO
13190 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
131a0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
131b0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
131c0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
131d0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
131e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
131f0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
13200 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
13210 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
13220 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
13230 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
13240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
13260 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
13270 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
13280 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
13290 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
132a0 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
132b0 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
132c0 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
132d0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
132e0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
132f0 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52    TRACE3("NOSTOR
13300 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
13310 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13320 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
13330 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13340 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13350 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
13360 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
13370 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13380 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
13390 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
133a0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
133b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
133c0 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
133d0 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
133e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
133f0 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
13400 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
13410 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
13420 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
13430 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
13440 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
13450 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
13460 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
13470 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
13480 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
13490 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
134a0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
134b0 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
134c0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
134d0 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c  *p, *pList;.  pL
134e0 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ist = 0;.  for(p
134f0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
13500 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
13510 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72  {.    if( p->dir
13520 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ty ){.      p->p
13530 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20  Dirty = pList;. 
13540 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a       pList = p;.
13550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13560 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
13570 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
13580 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
13590 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
135a0 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
135b0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
135c0 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
135d0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
135e0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
135f0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
13600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13610 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
13620 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
13630 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
13640 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
13650 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
13660 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
13670 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
13680 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
13690 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
136a0 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
136b0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
136c0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
136d0 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
136e0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
136f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
13700 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
13710 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
13720 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nal) ) return 0;
13730 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
13740 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
13750 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  k(pPager->fd) ) 
13760 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
13770 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
13780 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d  ecount(pPager)==
13790 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
137a0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
137b0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
137c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
137d0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
137e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
137f0 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
13800 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
13810 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c  at can be recycl
13820 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed. .**.** This 
13830 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75  routine may retu
13840 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  rn SQLITE_IOERR,
13850 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20   SQLITE_FULL or 
13860 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a  SQLITE_OK. It .*
13870 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74  * does not set t
13880 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  he pPager->errCo
13890 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  de variable..*/.
138a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
138b0 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a  _recycle(Pager *
138c0 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63  pPager, int sync
138d0 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  Ok, PgHdr **ppPg
138e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
138f0 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
13900 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
13910 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
13920 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
13930 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
13940 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
13950 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
13960 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
13970 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50  .  */.  pPg = pP
13980 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
13990 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ed;..  /* If we 
139a0 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
139b0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
139c0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
139d0 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74  sync().  ** on t
139e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
139f0 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
13a00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
13a10 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72  is is a.  ** ver
13a20 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
13a30 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
13a40 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
13a50 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
13a60 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
13a70 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  elped..  */.  if
13a80 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67  ( pPg==0 && pPag
13a90 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79  er->pFirst && sy
13aa0 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b  ncOk && !MEMDB){
13ab0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
13ac0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
13ad0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
13ae0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13af0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
13b00 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
13b10 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ync ){.      /* 
13b20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
13b30 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65  mode, write a ne
13b40 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  w journal header
13b50 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
13b60 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
13b70 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
13b80 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69   avoid ever modi
13b90 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a  fying a journal.
13ba0 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20        ** header 
13bb0 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
13bc0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
13bd0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
13be0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  ave.      ** alr
13bf0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
13c00 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
13c10 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
13c20 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a  eader is.      *
13c30 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74  * trashed when t
13c40 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
13c50 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20   updated)..     
13c60 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
13c70 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
13c80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13c90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30  ->journalOff > 0
13ca0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
13cb0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
13cc0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
13cd0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
13ce0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13cf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13d00 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
13d10 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  irst;.  }.  if( 
13d20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pPg==0 ){.    re
13d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13d40 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
13d50 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
13d60 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
13d70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
13d80 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
13d90 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
13da0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
13db0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
13dc0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13dd0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
13de0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
13df0 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
13e00 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
13e10 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28  ( pPg );.    if(
13e20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13e30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
13e40 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
13e50 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
13e60 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
13e70 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
13e80 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
13e90 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
13ea0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a  llback, then.  *
13eb0 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
13ec0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
13ed0 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
13ee0 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71  ling the.  ** sq
13ef0 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  lite_dont_rollba
13f00 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
13f10 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
13f20 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
13f30 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  on..  ** It is n
13f40 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
13f50 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
13f60 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
13f70 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  ysRollback.  ** 
13f80 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
13f90 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
13fa0 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
13fb0 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
13fc0 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ember.  ** that 
13fd0 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c  is was marked al
13fe0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54  waysRollback.  T
13ff0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
14000 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20  ll pages must.  
14010 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
14020 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
14030 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
14040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
14050 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
14060 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ){.    pPager->a
14070 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
14080 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  1;.  }..  /* Unl
14090 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
140a0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
140b0 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
140c0 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e   table.  */.  un
140d0 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
140e0 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
140f0 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70  r->nOvfl);..  *p
14100 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
14110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14120 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
14130 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
14140 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
14150 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
14160 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
14170 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
14180 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
14190 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
141a0 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
141b0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
141c0 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
141d0 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
141e0 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  Free()ed..**.** 
141f0 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
14200 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
14210 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
14220 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
14230 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
14240 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
14250 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67  n returns. A neg
14260 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20  ative value for 
14270 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72  nReq means.** fr
14280 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
14290 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54  y as possible. T
142a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
142b0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
142c0 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
142d0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
142e0 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
142f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
14300 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69  ORY_MANAGEMENT.i
14310 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
14320 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69  release_memory(i
14330 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73  nt nReq){.  cons
14340 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54  t ThreadData *pT
14350 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68  sdro = sqlite3Th
14360 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
14370 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a  ();.  Pager *p;.
14380 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20    int nReleased 
14390 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
143a0 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67   /* If the the g
143b0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68  lobal mutex is h
143c0 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75  eld, this subrou
143d0 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20  tine becomes a. 
143e0 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62   ** o-op; zero b
143f0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ytes of memory a
14400 72 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20  re freed.  This 
14410 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  is because.  ** 
14420 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65  some of the code
14430 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73   invoked by this
14440 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
14450 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f  so.  ** try to o
14460 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c  btain the mutex,
14470 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
14480 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  deadlock..  */. 
14490 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e   if( sqlite3OsIn
144a0 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20  Mutex(0) ){.    
144b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
144c0 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f   /* Outermost lo
144d0 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d  op runs for at m
144e0 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f  ost two iteratio
144f0 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74  ns. First iterat
14500 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20  ion we.  ** try 
14510 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74  to find memory t
14520 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  hat can be relea
14530 73 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c  sed without call
14540 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63  ing fsync(). Sec
14550 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69  ond.  ** iterati
14560 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72  on (which only r
14570 75 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74  uns if the first
14580 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20   failed to free 
14590 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20  nReq bytes of.  
145a0 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65  ** memory) is pe
145b0 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20  rmitted to call 
145c0 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73  fsync(). This is
145d0 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20   of course much 
145e0 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e  more .  ** expen
145f0 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  sive..  */.  for
14600 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29  (i=0; i<=1; i++)
14610 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74  {..    /* Loop t
14620 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53  hrough all the S
14630 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65  QLite pagers ope
14640 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
14650 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  nt thread. */.  
14660 20 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e    for(p=pTsdro->
14670 70 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52  pPager; p && (nR
14680 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
14690 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e  d<nReq); p=p->pN
146a0 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
146b0 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
146c0 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t rc;..      /* 
146d0 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
146e0 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
146f0 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
14700 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
14710 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
14720 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
14730 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
14740 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
14750 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
14760 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
14770 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
14780 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
14790 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
147a0 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70  , i, &pPg)) && p
147b0 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  Pg) {.        /*
147c0 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
147d0 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
147e0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
147f0 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
14800 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
14810 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
14820 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
14830 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
14840 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  list .        **
14850 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
14860 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
14870 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
14880 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
14890 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74      ** Remove it
148a0 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20   from this list 
148b0 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a  before freeing..
148c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
148d0 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
148e0 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
148f0 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
14900 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
14910 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  It .        ** p
14920 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67  robably is thoug
14930 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  h..        */.  
14940 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
14950 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
14960 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
14970 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
14980 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
14990 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
149a0 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pg==p->pAll ){. 
149b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c            p->pAl
149c0 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
149d0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
149e0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
149f0 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70   pTmp=p->pAll; p
14a00 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
14a10 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
14a20 4e 65 78 74 41 6c 6c 20 29 3b 0a 20 20 20 20 20  NextAll );.     
14a30 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
14a40 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
14a50 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
14a60 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
14a70 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
14a80 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
14a90 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
14aa0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
14ab0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
14ad0 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
14ae0 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
14af0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
14b00 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
14b10 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
14b20 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
14b30 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
14b40 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
14b50 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
14b60 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
14b70 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
14b80 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
14b90 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
14ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
14bb0 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
14bc0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
14bd0 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
14be0 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
14bf0 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
14c00 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
14c10 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
14c20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
14c30 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
14c40 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14c50 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  rt( rc==SQLITE_I
14c60 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OERR || rc==SQLI
14c70 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TE_FULL );.     
14c80 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74     assert( p->st
14c90 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
14ca0 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70  VED );.        p
14cb0 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63  ager_error(p, rc
14cc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14cd0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
14ce0 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
14cf0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
14d00 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
14d10 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
14d20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
14d30 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
14d40 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
14d50 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
14d60 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
14d70 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
14d80 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
14d90 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
14da0 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
14db0 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
14dc0 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
14dd0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
14de0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
14df0 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
14e00 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
14e10 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
14e20 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
14e30 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
14e40 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
14e50 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
14e60 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
14e70 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
14e80 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
14e90 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
14ea0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
14eb0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
14ec0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
14ed0 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
14ee0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
14ef0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
14f00 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
14f10 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
14f20 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
14f30 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
14f40 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
14f50 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
14f60 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14f70 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
14f80 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
14f90 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
14fa0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
14fb0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
14fc0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
14fd0 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
14fe0 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
14ff0 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
15000 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
15010 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
15020 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
15030 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
15040 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
15050 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
15060 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
15070 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
15080 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
15090 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
150a0 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
150b0 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
150c0 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
150d0 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
150e0 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
150f0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
15100 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
15110 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
15120 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
15130 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
15140 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
15150 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
15160 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
15170 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
15180 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
15190 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
151a0 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
151b0 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
151c0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
151d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
151e0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
151f0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
15200 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
15210 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
15220 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
15230 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
15240 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
15250 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
15260 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
15270 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
15280 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
15290 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
152a0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
152b0 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
152c0 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
152d0 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
152e0 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
152f0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
15300 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  ppPage = 0;.  if
15310 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
15320 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
15330 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
15340 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
15350 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
15360 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15370 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
15380 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
15390 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
153a0 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
153b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
153c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
153d0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
153e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28  MEMDB ){.    if(
153f0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
15400 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
15410 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
15420 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
15430 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
15440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
15460 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
15470 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
15480 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
15490 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
154a0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
154b0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
154c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
154d0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
154e0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
154f0 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
15500 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
15510 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
15520 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48   */.    if( hasH
15530 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
15540 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20  ) ){.       int 
15550 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47  rc;..       /* G
15560 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
15570 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15580 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
15590 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
155a0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
155b0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
155c0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
155d0 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
155e0 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
155f0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
15600 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
15610 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
15620 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
15630 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
15640 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
15650 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
15660 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
15670 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a  hat the.       *
15680 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
15690 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
156a0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
156b0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69   still rolling i
156c0 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63  t .       ** bac
156d0 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  k..       ** .  
156e0 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
156f0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
15700 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
15710 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
15720 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73   the.       ** s
15730 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
15740 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
15750 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
15760 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
15770 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
15780 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
15790 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
157a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
157b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
157c0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
157d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
157e0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
157f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15810 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
15820 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
15830 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
15840 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
15850 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
15860 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
15870 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
15880 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d  r, rc);.       }
15890 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
158a0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
158b0 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20  CLUSIVE;..      
158c0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
158d0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67  rnal for reading
158e0 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53   only.  Return S
158f0 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20  QLITE_BUSY if.  
15900 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
15910 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
15920 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
15930 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  .       **.     
15940 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
15950 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
15960 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
15970 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
15980 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
15990 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
159a0 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
159b0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
159c0 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a   holds.       **
159d0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
159e0 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
159f0 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
15a00 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
15a10 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
15a20 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
15a30 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
15a40 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ime..       */. 
15a50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15a60 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
15a70 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
15a80 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  l, &pPager->jfd)
15a90 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
15aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15ab0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
15ac0 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
15ad0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
15ae0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
15af0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
15b00 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
15b10 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
15b20 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
15b30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15b40 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
15b50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15b60 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
15b70 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
15b80 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
15b90 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
15ba0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
15bb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15bc0 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Hdr = 0;..      
15bd0 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
15be0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
15bf0 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
15c00 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
15c10 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
15c20 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
15c30 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
15c40 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
15c50 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
15c60 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69  Pager);.       i
15c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
15c90 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
15ca0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
15cb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15cc0 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
15cd0 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
15ce0 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
15cf0 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
15d00 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
15d10 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  er, pgno);.    i
15d20 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
15d30 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
15d40 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
15d50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
15d60 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
15d70 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
15d80 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
15d90 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
15da0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
15db0 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
15dc0 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54      int h;.    T
15dd0 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
15de0 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28  >nMiss);.    if(
15df0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
15e00 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
15e10 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
15e20 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20  =0 || MEMDB ){. 
15e30 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
15e40 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20   new page */.   
15e50 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d     pPg = sqliteM
15e60 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
15e70 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
15e80 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
15eb0 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
15ec0 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
15ef0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
15f00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
15f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
15f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15f30 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
15f40 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
15f50 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
15f60 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
15f70 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
15f80 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
15f90 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
15fa0 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
15fb0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
15fc0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
15fd0 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
15fe0 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
15ff0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
16000 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
16010 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
16020 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
16030 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
16040 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61  Page>pPager->nMa
16050 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
16060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16070 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67  >nMaxPage==(pPag
16080 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a  er->nPage-1) );.
16090 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
160a0 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20  nMaxPage++;.    
160b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
160c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
160d0 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20  recycle(pPager, 
160e0 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  1, &pPg);.      
160f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
16110 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
16120 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16130 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
16140 74 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a 20  t(pPg) ;.    }. 
16150 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
16160 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61  gno;.    if( pPa
16170 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
16180 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
16190 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
161a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
161b0 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61  3CheckMemory(pPa
161c0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->aInJournal,
161d0 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20   pgno/8);.      
161e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
161f0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
16200 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
16210 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
16220 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
16230 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
16240 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
16250 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
16260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16270 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
16280 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
16290 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
162a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
162b0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28  er->aInStmt && (
162c0 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
162d0 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20  ->stmtSize.     
162e0 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67          && (pPag
162f0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f  er->aInStmt[pgno
16300 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
16310 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  7)))!=0 ){.     
16320 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
16330 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
16340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61   }else{.      pa
16350 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73  ge_remove_from_s
16360 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
16370 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69     }.    pPg->di
16380 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  rty = 0;.    pPg
16390 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
163a0 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20  REFINFO(pPg);.  
163b0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
163c0 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f  ;.    h = pager_
163d0 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20  hash(pgno);.    
163e0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
163f0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
16400 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
16410 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
16420 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
16430 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
16440 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
16450 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
16460 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
16470 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
16480 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
16490 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
164a0 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
164b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
164c0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
164d0 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
164e0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
164f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
16500 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
16510 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
16520 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
16530 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
16540 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
16550 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72  errCode;.      r
16560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16570 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 70      if( sqlite3p
16580 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
16590 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f  Pager)<(int)pgno
165a0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
165b0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
165c0 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
165d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
165e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
165f0 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
16600 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
16610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16620 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
16630 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
16640 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
16650 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
16660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16670 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16680 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
16690 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
166a0 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20  ATA(pPg),.      
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
166d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
166e0 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28   }.      TRACE3(
166f0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
16700 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
16710 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
16720 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
16730 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
16740 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
16750 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
16760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16770 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  K ){.        i64
16780 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20   fileSize;.     
16790 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
167a0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
167b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 66 69 6c 65  Pager->fd, &file
167c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Size);.        i
167d0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
167e0 4b 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70  K || fileSize>=p
167f0 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  gno*pPager->page
16800 53 69 7a 65 20 29 7b 0a 09 20 20 2f 2a 20 41 6e  Size ){..  /* An
16810 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 65   IO error occure
16820 64 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  d in one of the 
16830 74 68 65 20 73 71 6c 69 74 65 33 4f 73 53 65 65  the sqlite3OsSee
16840 6b 28 29 20 6f 72 0a 20 20 20 20 20 20 20 20 20  k() or.         
16850 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 52 65 61   ** sqlite3OsRea
16860 64 28 29 20 63 61 6c 6c 73 20 61 62 6f 76 65 2e  d() calls above.
16870 20 55 6e 72 65 66 65 72 65 6e 63 65 20 74 68 65   Unreference the
16880 20 70 61 67 65 20 61 6e 64 20 74 68 65 6e 0a 20   page and then. 
16890 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20           ** set 
168a0 69 74 27 73 20 70 61 67 65 20 6e 75 6d 62 65 72  it's page number
168b0 20 74 6f 20 30 20 28 30 20 6d 65 61 6e 73 20 22   to 0 (0 means "
168c0 6e 6f 74 20 61 20 70 61 67 65 22 29 2e 0a 20 20  not a page")..  
168d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
168e0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
168f0 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
16900 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
16910 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
16920 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
16930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16950 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61      clear_simula
16960 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a  ted_io_error();.
16970 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
16980 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
16990 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
169a0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
169b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
169c0 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49  {.        TEST_I
169d0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
169e0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
169f0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
16a00 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
16a10 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
16a20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
16a30 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
16a40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
16a50 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
16a60 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
16a70 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54  che. */.    TEST
16a80 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
16a90 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  it);.    page_re
16aa0 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
16ab0 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
16ac0 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
16ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
16af0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
16b00 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
16b10 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
16b20 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
16b30 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
16b40 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
16b50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
16b60 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
16b70 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
16b80 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
16b90 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
16ba0 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
16bb0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16bc0 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
16bd0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70  .** and sqlite3p
16be0 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
16bf0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
16c00 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
16c10 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
16c20 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
16c30 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
16c40 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
16c50 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
16c60 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
16c70 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
16c80 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
16c90 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
16ca0 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
16cb0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
16cc0 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
16cd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16ce0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
16cf0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
16d00 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
16d10 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
16d20 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
16d30 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
16d40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
16d50 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
16d60 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16d70 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
16d80 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
16d90 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
16da0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
16db0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
16dc0 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
16dd0 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
16de0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
16df0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
16e00 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
16e10 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
16e20 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
16e30 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
16e40 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
16e50 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
16e60 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
16e70 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
16e80 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
16e90 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
16ea0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
16eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16ec0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
16ed0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
16ee0 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
16ef0 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
16f00 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
16f10 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
16f20 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
16f30 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
16f40 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
16f50 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
16f60 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
16f70 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
16f80 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
16f90 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
16fa0 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
16fb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
16fc0 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
16fd0 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
16fe0 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
16ff0 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
17000 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
17010 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
17020 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
17030 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
17040 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
17050 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
17060 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
17070 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
17080 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
17090 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
170a0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
170b0 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
170c0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
170d0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
170e0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
170f0 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
17100 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
17110 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
17120 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
17130 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
17140 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
17150 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
17160 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
17170 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
17180 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17190 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
171a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
171b0 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
171c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
171d0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
171e0 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
171f0 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
17200 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
17210 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
17220 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
17230 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
17240 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
17250 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
17260 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
17270 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17280 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
17290 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67  MDB ){.      pag
172a0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
172b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
172c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
172d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
172e0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
172f0 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
17300 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
17310 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
17320 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
17330 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17340 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
17350 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
17360 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
17370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
17380 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
17390 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
173a0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
173b0 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
173c0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
173d0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
173e0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
173f0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
17400 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
17410 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
17420 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
17430 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17440 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
17450 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
17460 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
17470 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17480 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
17490 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
174a0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
174b0 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
174c0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
174d0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
174e0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
174f0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
17500 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
17510 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
17520 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
17530 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
17540 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17550 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
17560 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
17570 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
17580 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
17590 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
175a0 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
175b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175d0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
175e0 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
175f0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
17600 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
17610 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
17620 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
17630 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
17650 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
17660 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
17670 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
17680 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
17690 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  , pPager->fullSy
176a0 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
176b0 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
176c0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
176d0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
176e0 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74  ite3OsOpenDirect
176f0 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ory(pPager->jfd,
17700 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
17710 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ory);.  pPager->
17720 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
17730 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
17740 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
17750 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
17760 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
17770 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
17780 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
17790 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
177a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
177b0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
177c0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
177d0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
177e0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
177f0 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
17800 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
17810 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
17820 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
17830 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
17840 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
17850 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
17860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
17870 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
17880 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72  tmt_begin(pPager
17890 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
178a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
178b0 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
178c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
178d0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
178e0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
178f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17900 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17910 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
17920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
17930 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
17940 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46  urnal:.  sqliteF
17950 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
17960 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
17970 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
17980 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
17990 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
179a0 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
179b0 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
179c0 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  re, then we will
179d0 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67 20   not be closing 
179e0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
179f0 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65   file. So delete
17a00 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   any journal fil
17a10 65 20 77 65 20 6d 61 79 20 68 61 76 65 20 6a 75  e we may have ju
17a20 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74 68 65  st created. Othe
17a30 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  rwise,.    ** th
17a40 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20 67 65  e system will ge
17a50 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65 20 68  t confused, we h
17a60 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ave a read-lock 
17a70 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
17a80 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65 72 69  a.    ** mysteri
17a90 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  ous journal has 
17aa0 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20  appeared in the 
17ab0 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20 20  filesystem..    
17ac0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  */.    sqlite3Os
17ad0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
17ae0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73  Journal);.  }els
17af0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e{.    sqlite3Os
17b00 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
17b10 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
17b20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
17b30 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
17b40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17b50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
17b60 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
17b70 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
17b80 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
17b90 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
17ba0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
17bb0 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
17bc0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
17bd0 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
17be0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
17bf0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
17c00 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
17c10 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
17c20 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
17c30 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
17c40 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
17c50 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
17c60 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
17c70 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
17c80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
17c90 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
17ca0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17cb0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
17cc0 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
17cd0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17ce0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
17cf0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
17d00 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
17d10 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
17d20 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
17d30 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
17d40 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
17d50 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
17d60 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
17d70 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
17d80 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
17d90 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
17da0 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
17db0 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
17dc0 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
17dd0 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
17de0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
17df0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
17e00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
17e10 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
17e20 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
17e30 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
17e40 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
17e50 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
17e60 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
17e70 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
17e80 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
17e90 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
17ea0 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
17eb0 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
17ec0 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
17ed0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
17ee0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
17ef0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
17f00 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
17f10 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
17f20 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
17f30 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
17f40 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
17f50 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
17f60 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
17f70 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
17f80 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
17f90 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
17fa0 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
17fb0 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
17fc0 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
17fd0 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
17fe0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
17ff0 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
18000 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
18010 67 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  gin(void *pData,
18020 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
18030 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
18040 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
18050 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
18060 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
18070 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18080 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
18090 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
180a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
180b0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
180c0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
180d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
180e0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
180f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18100 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
18110 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
18120 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
18130 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
18140 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
18150 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
18160 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
18170 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
18180 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18190 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
181a0 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
181b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
181c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
181d0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
181e0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
181f0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
18200 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
18210 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
18220 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
18230 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
18240 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
18250 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18280 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18290 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
182a0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
182b0 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
182c0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
182d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
182e0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
182f0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
18300 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
18310 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
18320 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
18330 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
18340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18350 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
18370 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
18380 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
18390 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
183a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
183b0 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
183c0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
183d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
183e0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
183f0 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
18400 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
18410 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
18420 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
18430 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
18440 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
18450 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
18460 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
18470 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
18480 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
18490 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
184a0 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
184b0 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
184c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
184d0 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
184e0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
184f0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
18500 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
18510 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
18520 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
18530 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
18540 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
18550 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
18560 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
18570 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
18580 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
18590 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
185a0 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
185b0 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
185c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
185d0 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
185e0 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
185f0 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
18600 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
18610 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
18620 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
18630 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
18640 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
18650 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
18660 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
18670 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
18680 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
18690 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
186a0 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
186b0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
186c0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
186d0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
186e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
186f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
18700 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18710 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
18720 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
18730 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18740 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
18750 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
18760 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
18770 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
18780 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18790 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
187a0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
187b0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
187c0 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
187d0 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
187e0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
187f0 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
18800 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18810 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
18820 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
18830 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
18840 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
18850 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20  .  pPg->dirty = 
18860 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  1;.  if( pPg->in
18870 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d  Journal && (pPg-
18880 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65  >inStmt || pPage
18890 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
188a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
188b0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
188c0 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
188d0 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
188e0 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
188f0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
18900 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
18910 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
18920 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
18930 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
18940 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
18950 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
18960 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
18970 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
18980 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
18990 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
189a0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
189b0 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
189c0 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
189d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
189e0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
189f0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
18a00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
18a10 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20  gin(pData, 0);. 
18a20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
18a40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18a50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18a60 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
18a70 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
18a80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
18a90 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
18aa0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
18ab0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
18ac0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
18ad0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
18ae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18af0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
18b00 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18b10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18b20 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
18b30 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
18b40 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
18b50 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
18b60 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
18b70 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
18b80 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
18b90 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
18ba0 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
18bb0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
18bc0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
18bd0 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
18be0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
18bf0 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
18c00 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
18c10 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
18c20 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
18c30 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
18c40 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
18c50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
18c60 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
18c70 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
18c80 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
18c90 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
18ca0 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
18cb0 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 73 61  ;.        u32 sa
18cc0 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ved;.        if(
18cd0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
18ce0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
18cf0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
18d00 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
18d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  );.          TRA
18d20 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE3("JOURNAL %d 
18d30 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
18d40 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
18d50 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
18d60 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
18d70 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
18d80 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
18d90 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Orig = sqliteMal
18da0 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e  locRaw( pPager->
18db0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
18dc0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
18dd0 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
18de0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
18df0 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
18e00 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
18e10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
18e20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18e30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18e40 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
18e50 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ;.          /* W
18e60 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
18e70 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
18e80 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
18e90 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
18ea0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
18eb0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
18ec0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
18ed0 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
18ee0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
18ef0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
18f00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18f10 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
18f20 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
18f30 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r) );.          
18f40 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
18f50 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
18f60 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b  7);.          ck
18f70 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
18f80 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  m(pPager, pPg->p
18f90 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  gno, pData);.   
18fa0 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
18fb0 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
18fc0 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
18fd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  );.          sto
18fe0 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20  re32bits(cksum, 
18ff0 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
19000 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
19010 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d    szPg = pPager-
19020 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20  >pageSize+8;.   
19030 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
19040 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ts(pPg->pgno, pP
19050 67 2c 20 2d 34 29 3b 0a 0a 20 20 20 20 20 20 20  g, -4);..       
19060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19070 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
19080 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
19090 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
190a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
190b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
190c0 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
190d0 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20  TRACE4("JOURNAL 
190e0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
190f0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
19110 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
19120 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
19130 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
19140 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
19150 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
19160 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 0);.         
19170 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
19180 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
19190 65 72 29 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20  er) = saved;... 
191a0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
191b0 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
191c0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
191d0 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
191e0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
191f0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
19200 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
19210 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
19220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
19230 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19240 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 30 0a 20 20  E_OK ){.#if 0.  
19250 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19260 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
19270 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
19280 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
19290 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
192a0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72             pager
192b0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 53  _error(pPager, S
192c0 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 20  QLITE_FULL);.   
192d0 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
192e0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  f.            re
192f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
19300 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
19310 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
19320 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19330 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
19340 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
19350 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
19360 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
19370 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
19380 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
19390 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
193a0 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
193b0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
193c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
193d0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
193e0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
193f0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
19400 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
19410 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
19420 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
19430 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
19440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19450 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
19460 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  .        pPg->ne
19470 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
19480 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
19490 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
194a0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ync;.        TRA
194b0 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE4("APPEND %d p
194c0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
194d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
194e0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
194f0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
19500 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
19510 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19520 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
19530 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  nc ){.        pP
19540 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
19550 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
19560 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
19570 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 1;.    }.  . 
19580 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
19590 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
195a0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
195b0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
195c0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
195d0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
195e0 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
195f0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
19600 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
19610 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
19620 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
19630 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
19640 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
19650 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
19660 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
19670 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
19680 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
19690 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
196a0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
196b0 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
196c0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
196d0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
196e0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
196f0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
19700 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
19710 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
19720 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
19730 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
19740 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
19750 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
19760 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
19770 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
19780 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
19790 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
197a0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
197b0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
197c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
197d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
197e0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
197f0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
19800 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
19810 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
19820 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
19830 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
19840 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
19850 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
19860 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
19870 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
19880 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  >pgno);.      }e
19890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  lse{.        sto
198a0 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
198b0 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
198c0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
198d0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
198e0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
198f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19900 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74  Write(pPager->st
19910 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61 74 61  fd,((char*)pData
19920 29 2d 34 2c 0a 20 20 20 20 20 20 20 20 20 20 20  )-4,.           
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
19950 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20  Size+4);.       
19960 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f   TRACE3("STMT-JO
19970 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
19980 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
19990 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
199a0 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28  ;.        CODEC(
199b0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
199c0 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  Pg->pgno, 0);.  
199d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
199e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
199f0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
19a00 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
19a10 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
19a20 28 20 21 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ( !pPager->errCo
19a30 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
19a40 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
19a50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 46 55 4c  ager, SQLITE_FUL
19a60 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  L);.          }.
19a70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19a80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
19a90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
19aa0 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
19ab0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19ac0 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
19ad0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
19ae0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
19af0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
19b00 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
19b10 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64   }.      page_ad
19b20 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
19b30 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
19b40 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
19b50 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
19b60 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
19b70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
19b80 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
19b90 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
19ba0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
19bb0 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
19bc0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
19bd0 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
19be0 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
19bf0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
19c00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
19c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19c20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19c30 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
19c40 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
19c50 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
19c60 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
19c70 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
19c80 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e  e3pager_write().
19c90 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
19ca0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
19cb0 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
19cc0 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
19cd0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
19ce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19cf0 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
19d00 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
19d10 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
19d20 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
19d30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
19d40 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23 69 66 6e 64  >dirty;.}..#ifnd
19d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19d60 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  ACUUM./*.** Repl
19d70 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
19d80 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
19d90 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
19da0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
19db0 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
19dc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19dd0 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61  ger_overwrite(Pa
19de0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19df0 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
19e00 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ata){.  void *pP
19e10 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
19e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
19e30 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
19e40 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
19e50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19e60 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
19e70 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
19e80 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
19e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19ea0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
19eb0 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70 50  pPage, pData, pP
19ec0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19ed0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19ee0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
19ef0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
19f00 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
19f10 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
19f20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
19f30 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
19f40 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
19f50 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
19f60 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
19f70 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
19f80 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
19f90 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
19fa0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
19fb0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
19fc0 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
19fd0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
19fe0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
19ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1a000 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
1a010 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
1a020 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
1a030 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
1a040 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
1a050 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
1a060 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
1a070 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1a080 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
1a090 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
1a0a0 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
1a0b0 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
1a0c0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1a0d0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  _rollback() belo
1a0e0 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
1a0f0 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
1a100 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
1a110 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
1a120 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
1a130 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1a140 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1a150 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a160 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1a170 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1a180 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1a190 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1a1a0 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  s to sqlite3page
1a1b0 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
1a1c0 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
1a1d0 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
1a1e0 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
1a1f0 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
1a200 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
1a210 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
1a220 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
1a230 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
1a240 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1a250 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
1a260 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
1a270 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
1a280 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
1a290 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
1a2a0 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
1a2b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
1a2c0 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
1a2d0 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
1a2e0 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
1a2f0 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
1a300 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
1a310 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a320 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
1a330 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72  d,.** the dont_r
1a340 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1a350 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1a360 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  t because the pa
1a370 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63  ge contains.** c
1a380 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1a390 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1a3a0 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72  e sure it gets r
1a3b0 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
1a3c0 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f  ite.** of the do
1a3d0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61  nt_rollback() ca
1a3e0 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
1a3f0 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
1a400 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
1a410 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1a420 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1a430 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1a440 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
1a450 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1a460 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e  , pgno);.  pPg->
1a470 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1a480 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26   1;.  if( pPg &&
1a490 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21   pPg->dirty && !
1a4a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1a4b0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1a4c0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
1a4d0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
1a4e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a4f0 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
1a500 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1a510 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
1a520 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
1a530 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
1a540 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
1a550 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
1a560 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1a570 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
1a580 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
1a590 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
1a5a0 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
1a5b0 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
1a5c0 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
1a5d0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
1a5e0 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
1a5f0 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
1a600 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
1a610 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
1a620 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
1a630 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
1a640 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
1a650 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
1a660 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
1a670 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
1a680 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
1a690 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
1a6a0 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
1a6b0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1a6c0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
1a6d0 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
1a6e0 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
1a6f0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1a700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
1a710 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54  RACE3("DONT_WRIT
1a720 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
1a730 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49  n", pgno, PAGERI
1a740 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1a750 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1a760 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a770 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1a780 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
1a790 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1a7a0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
1a7b0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a7c0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1a7d0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1a7e0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
1a7f0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1a800 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
1a810 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
1a820 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
1a830 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
1a840 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
1a850 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
1a860 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
1a870 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
1a880 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
1a890 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a8a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a8b0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
1a8c0 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
1a8d0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1a8e0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1a8f0 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
1a900 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1a910 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
1a920 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1a930 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
1a940 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a950 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
1a960 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
1a970 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
1a980 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1a990 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20  back || MEMDB ) 
1a9a0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
1a9b0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1a9c0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
1a9d0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
1a9e0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
1a9f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1aa00 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1aa10 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1aa20 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
1aa30 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1aa40 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
1aa50 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1aa60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1aa70 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1aa80 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1aa90 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1aaa0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1aab0 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
1aac0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1aad0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
1aae0 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
1aaf0 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
1ab00 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1ab10 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1ab20 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  r));.  }.  if( p
1ab30 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ab40 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
1ab50 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1ab60 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
1ab70 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
1ab80 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1ab90 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1aba0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1abb0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
1abc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1abd0 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1abe0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1abf0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1ac00 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1ac10 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
1ac20 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1ac30 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64  );.  }.}...#ifnd
1ac40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
1ac50 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
1ac60 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
1ac70 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
1ac80 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
1ac90 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
1aca0 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
1acb0 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
1acc0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
1acd0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
1ace0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
1acf0 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
1ad00 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
1ad10 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
1ad20 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
1ad30 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1ad40 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1ad50 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
1ad60 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1ad70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1ad80 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
1ad90 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
1ada0 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
1adb0 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
1adc0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1add0 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
1ade0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
1adf0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1ae00 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1ae10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
1ae20 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
1ae30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1ae40 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1ae50 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1ae60 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
1ae70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ae80 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
1ae90 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1aea0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1aeb0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1aec0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1aed0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
1aee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1aef0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1af00 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
1af10 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74  errCode;.    ret
1af20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1af30 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
1af40 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1af50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1af60 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1af70 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20   TRACE2("COMMIT 
1af80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1af90 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1afa0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20  EMDB ){.    pPg 
1afb0 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1afc0 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1afd0 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
1afe0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  pPg ){.      cle
1aff0 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
1b000 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1b010 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
1b020 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1b030 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1b040 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
1b050 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1b060 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
1b070 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
1b080 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1b090 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
1b0a0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1b0b0 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
1b0c0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1b0d0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1b0e0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
1b0f0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1b100 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1b110 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1b120 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
1b130 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1b140 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
1b150 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
1b160 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b170 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
1b180 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1b190 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1b1a0 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
1b1b0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1b1c0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
1b1d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b1e0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1b1f0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29  >dirtyCache==0 )
1b200 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61  {.    /* Exit ea
1b210 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69  rly (without doi
1b220 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73  ng the time-cons
1b230 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53  uming sqlite3OsS
1b240 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
1b250 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
1b260 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
1b270 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1b280 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
1b290 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1b2a0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
1b2b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
1b2c0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1b2d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1b2e0 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
1b2f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1b300 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b310 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1b320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1b330 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20  er_sync(pPager, 
1b340 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
1b350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b360 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
1b370 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ort;.  }.  rc = 
1b380 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1b390 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
1b3a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1b3b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
1b3c0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1b3d0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1b3e0 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
1b3f0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1b400 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
1b410 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61 67  rt:.  sqlite3pag
1b420 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
1b430 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
1b440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1b450 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
1b460 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1b470 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
1b480 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
1b490 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
1b4a0 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
1b4b0 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
1b4c0 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
1b4d0 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
1b4e0 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
1b4f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b500 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
1b510 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1b520 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
1b530 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
1b540 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
1b550 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
1b560 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
1b570 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1b580 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
1b590 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
1b5a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1b5b0 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
1b5c0 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
1b5d0 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
1b5e0 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
1b5f0 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
1b600 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
1b610 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
1b620 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
1b630 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
1b640 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
1b650 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1b660 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1b670 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  ager_rollback(Pa
1b680 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b690 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32  int rc;.  TRACE2
1b6a0 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
1b6b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b6c0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1b6d0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1b6e0 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
1b6f0 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
1b700 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1b710 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1b720 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
1b730 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
1b740 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
1b750 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
1b760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1b770 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
1b780 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b790 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
1b7a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b7b0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
1b7c0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
1b7d0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
1b7e0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
1b7f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
1b800 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
1b810 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b820 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1b830 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
1b840 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1b850 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1b860 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
1b870 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b880 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  e);.        TRAC
1b890 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
1b8a0 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
1b8b0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1b8c0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1b8d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
1b8e0 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
1b8f0 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
1b900 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1b910 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1b920 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
1b930 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
1b940 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
1b950 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
1b960 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1b970 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
1b980 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
1b990 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
1b9a0 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
1b9b0 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
1b9c0 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
1b9d0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1b9e0 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
1b9f0 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  p), pPager->page
1ba00 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
1ba10 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20       .    }.    
1ba20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1ba30 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
1ba40 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1ba50 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
1ba60 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1ba70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1ba80 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1ba90 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1baa0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1bab0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1bac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1bad0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
1bae0 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
1baf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1bb00 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
1bb10 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1bb20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1bb30 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1bb40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1bb50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1bb60 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
1bb70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
1bb80 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
1bb90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1bba0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
1bbb0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
1bbc0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1bbd0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
1bbe0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1bbf0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
1bc00 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1bc10 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
1bc20 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1bc30 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1bc40 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
1bc50 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  ger);.    rc2 = 
1bc60 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1bc70 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
1bc80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bc90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1bca0 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
1bcb0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1bcc0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1bcd0 72 29 3b 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20  r);.  }.#if 0.  
1bce0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bcf0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
1bd00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1bd10 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
1bd20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1bd30 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e   -1;..  /* If an
1bd40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
1bd50 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
1bd60 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
1bd70 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
1bd80 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f  r.  ** cache. So
1bd90 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
1bda0 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
1bdb0 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
1bdc0 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69  rror .  ** persi
1bdd0 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65  stent..  */.  re
1bde0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1bdf0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1be00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1be10 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
1be20 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
1be30 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
1be40 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
1be50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1be60 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
1be70 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
1be80 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61  lite3pager_isrea
1be90 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
1bea0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1beb0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
1bec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1bed0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1bee0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
1bef0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
1bf00 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67  .int *sqlite3pag
1bf10 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a  er_stats(Pager *
1bf20 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
1bf30 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
1bf40 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [0] = pPager->nR
1bf50 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61  ef;.  a[1] = pPa
1bf60 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b  ger->nPage;.  a[
1bf70 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  2] = pPager->mxP
1bf80 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  age;.  a[3] = pP
1bf90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1bfa0 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
1bfb0 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
1bfc0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1bfd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1bfe0 53 54 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  ST.  a[6] = pPag
1bff0 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
1c000 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
1c010 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65  ;.  a[8] = pPage
1c020 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d  r->nOvfl;.  a[9]
1c030 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
1c040 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
1c050 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64  er->nWrite;.#end
1c060 69 66 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  if.  return a;.}
1c070 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1c080 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
1c090 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
1c0a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
1c0b0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
1c0c0 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
1c0d0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
1c0e0 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
1c0f0 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
1c100 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
1c110 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
1c120 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
1c130 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
1c140 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
1c150 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
1c160 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1c170 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1c180 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65  _stmt_begin(Page
1c190 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1c1a0 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65  t rc;.  char zTe
1c1b0 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
1c1c0 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65  ME_SIZE];.  asse
1c1d0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
1c1e0 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
1c1f0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
1c200 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  ze>=0 );.  TRACE
1c210 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64  2("STMT-BEGIN %d
1c220 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c230 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
1c240 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
1c250 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
1c260 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1c270 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
1c280 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75  dbSize;.    retu
1c290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1c2a0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
1c2b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
1c2c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c2d0 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  Autoopen = 1;.  
1c2e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c2f0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1c300 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c310 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65  lOpen );.  pPage
1c320 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c  r->aInStmt = sql
1c330 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
1c340 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1c350 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1c360 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  >aInStmt==0 ){. 
1c370 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c     /* sqlite3OsL
1c380 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
1c390 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f  SHARED_LOCK); */
1c3a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c3b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69  TE_NOMEM;.  }.#i
1c3c0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72  fndef NDEBUG.  r
1c3d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1c3e0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1c3f0 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74  d, &pPager->stmt
1c400 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
1c410 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1c420 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
1c430 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
1c440 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72  tJSize == pPager
1c450 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
1c460 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
1c470 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
1c480 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1c490 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
1c4a0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1c4b0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
1c4c0 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
1c4d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
1c4e0 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
1c4f0 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
1c500 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1c510 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1c520 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
1c530 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65  mp(zTemp, &pPage
1c540 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
1c550 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
1c560 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
1c570 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
1c580 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
1c590 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1c5a0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1c5b0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1c5c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c5d0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
1c5e0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
1c5f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1c600 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1c610 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
1c620 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1c630 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
1c640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c650 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
1c660 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1c670 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1c680 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  mt_commit(Pager 
1c690 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1c6a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c6b0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1c6c0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
1c6d0 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f   TRACE2("STMT-CO
1c6e0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1c6f0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1c700 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
1c710 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
1c720 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
1c730 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  , 0);.      /* s
1c740 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1c750 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
1c760 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
1c770 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
1c780 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
1c790 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c7a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1c7b0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1c7c0 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
1c7d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
1c7e0 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
1c7f0 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Stmt;.      asse
1c800 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  rt( pPg->inStmt 
1c810 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
1c820 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c830 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
1c840 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
1c850 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  = 0;.      if( M
1c860 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1c870 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1c880 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1c890 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1c8a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
1c8b0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
1c8c0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
1c8d0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
1c8e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
1c8f0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1c900 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1c910 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
1c920 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1c930 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
1c940 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1c950 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1c960 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c970 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
1c980 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
1c990 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
1c9a0 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
1c9b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1c9c0 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
1c9d0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1c9e0 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
1c9f0 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
1ca00 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1ca10 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
1ca20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
1ca30 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  pPg;.      for(p
1ca40 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
1ca50 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1ca60 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20  pNextStmt){.    
1ca70 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1ca80 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1ca90 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1caa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1cab0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
1cac0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1cad0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1cae0 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  g), pHist->pStmt
1caf0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1cb00 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
1cb10 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
1cb20 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
1cb30 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
1cb40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1cb50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1cb60 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1cb70 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a  ager->stmtSize;.
1cb80 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e        memoryTrun
1cb90 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
1cba0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cbb0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
1cbc0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1cbd0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50  stmt_playback(pP
1cbe0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
1cbf0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1cc00 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72  mt_commit(pPager
1cc10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cc20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cc30 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1cc40 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
1cc50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cc60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1cc70 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1cc80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1cc90 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
1cca0 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  ar *sqlite3pager
1ccb0 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  _filename(Pager 
1ccc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1ccd0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
1cce0 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
1ccf0 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74  eturn the direct
1cd00 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  ory of the datab
1cd10 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1cd20 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1cd30 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61  pager_dirname(Pa
1cd40 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1cd50 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
1cd60 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
1cd70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
1cd80 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
1cd90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1cda0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1cdb0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f  *sqlite3pager_jo
1cdc0 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
1cdd0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1cde0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
1cdf0 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
1ce00 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
1ce10 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
1ce20 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
1ce30 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
1ce40 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
1ce50 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
1ce60 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
1ce70 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1ce80 6e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  nosync(Pager *pP
1ce90 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1cea0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
1ceb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1cec0 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
1ced0 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
1cee0 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
1cef0 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
1cf00 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a  Pager,.  void (*
1cf10 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
1cf20 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
1cf30 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
1cf40 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  .){.  pPager->xC
1cf50 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20  odec = xCodec;. 
1cf60 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41   pPager->pCodecA
1cf70 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a  rg = pCodecArg;.
1cf80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1cf90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1cfa0 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
1cfb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
1cfc0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
1cfd0 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
1cfe0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
1cff0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1d000 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
1d010 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
1d020 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1d030 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50  void *pPage;.  P
1d040 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
1d050 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1d060 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1d070 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
1d080 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
1d090 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  writing. */.  rc
1d0a0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1d0b0 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  get(pPager, 1, &
1d0c0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1d0d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1d0e0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
1d0f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1d100 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  te(pPage);.  if(
1d110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d120 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
1d130 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65  * Read the curre
1d140 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65  nt value at byte
1d150 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72   24. */.  pPgHdr
1d160 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1d170 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67  (pPage);.  chang
1d180 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72  e_counter = retr
1d190 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64  ieve32bits(pPgHd
1d1a0 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e  r, 24);..  /* In
1d1b0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1d1c0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1d1d0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1d1e0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1d1f0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
1d200 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63  .  store32bits(c
1d210 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70  hange_counter, p
1d220 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f  PgHdr, 24);..  /
1d230 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
1d240 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
1d250 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
1d260 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
1d270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1d290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d2a0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
1d2b0 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
1d2c0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
1d2d0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
1d2e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1d2f0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1d300 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
1d310 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
1d320 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
1d330 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
1d340 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
1d350 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
1d360 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
1d370 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1d380 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1d390 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d3a0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
1d3b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
1d3c0 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
1d3d0 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
1d3e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d3f0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
1d400 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
1d410 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
1d420 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
1d430 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
1d440 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
1d450 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1d460 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
1d470 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1d480 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
1d490 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
1d4a0 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
1d4b0 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
1d4c0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
1d4d0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
1d4e0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
1d4f0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
1d500 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1d510 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1d520 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
1d530 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
1d540 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
1d550 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
1d560 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
1d570 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1d580 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
1d590 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1d5a0 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  _sync(Pager *pPa
1d5b0 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
1d5c0 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
1d5d0 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
1d5e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1d5f0 20 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53   TRACE4("DATABAS
1d600 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
1d610 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
1d620 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
1d630 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1d640 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
1d650 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
1d660 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1d670 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
1d680 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
1d690 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
1d6a0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
1d6b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d6c0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
1d6d0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1d6e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1d6f0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
1d700 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1d710 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
1d720 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
1d730 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d740 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d750 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
1d760 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1d770 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
1d780 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d790 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
1d7a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1d7b0 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
1d7c0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
1d7d0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
1d7e0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
1d7f0 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1d800 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
1d810 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1d820 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1d830 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1d840 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1d850 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1d860 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1d870 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1d880 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1d890 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1d8a0 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1d8b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1d8c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1d8d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1d8e0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1d8f0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
1d900 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d910 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1d920 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
1d930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d940 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
1d950 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1d960 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d970 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1d980 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1d990 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1d9a0 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1d9b0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1d9c0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1d9d0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1d9e0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1d9f0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1da00 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
1da10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1da20 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  o i;.        voi
1da30 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  d *pPage;.      
1da40 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
1da50 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1da60 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  er);.        for
1da70 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1da80 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1da90 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1daa0 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67        if( !(pPag
1dab0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69  er->aInJournal[i
1dac0 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29  /8] & (1<<(i&7))
1dad0 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1dae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1daf0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1db00 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1db10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1db20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1db30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1db40 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1db50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1db60 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1db70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1db80 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1db90 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
1dba0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dbb0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1dbc0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1dbd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
1dbe0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1dbf0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1dc00 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1dc10 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1dc20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dc30 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1dc40 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1dc50 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
1dc60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1dc70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1dc80 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1dc90 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  it;.    }..#ifnd
1dca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1dcb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1dcc0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1dcd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1dce0 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
1dcf0 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
1dd00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1dd10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1dd20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1dd30 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1dd40 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
1dd50 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
1dd60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1dd70 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
1dd80 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1dd90 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
1dda0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
1ddb0 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
1ddc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ddd0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1dde0 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
1ddf0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1de00 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
1de10 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
1de20 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
1de30 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1de40 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20  ager->fd, 0);.  
1de50 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
1de60 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1de70 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63  YNCED;.  }..sync
1de80 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
1de90 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1dea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1deb0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
1dec0 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69   the page identi
1ded0 66 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f  fied by pData to
1dee0 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
1def0 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  n the file. .**.
1df00 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
1df10 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
1df20 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  o the current pa
1df30 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72  ge pgno. If curr
1df40 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f  ent page.** pgno
1df50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1df60 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
1df70 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
1df80 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65  ot written there
1df90 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72   by.** by this r
1dfa0 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65  outine. The same
1dfb0 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20   applies to the 
1dfc0 70 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72  page pData refer
1dfd0 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f  s to on entry to
1dfe0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1dff0 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
1e000 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72  es to the page r
1e010 65 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61  efered to by pDa
1e020 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  ta remain valid.
1e030 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
1e040 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
1e050 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1e060 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61  pData (i.e. data
1e070 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
1e080 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
1e090 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
1e0a0 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
1e0b0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1e0c0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1e0d0 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
1e0e0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
1e0f0 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
1e100 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1e110 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
1e120 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
1e130 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
1e140 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
1e150 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
1e160 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
1e170 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
1e180 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
1e190 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
1e1a0 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
1e1b0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
1e1c0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
1e1d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e1e0 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50  pager_movepage(P
1e1f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
1e200 69 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20  id *pData, Pgno 
1e210 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
1e220 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
1e230 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67  HDR(pData);.  Pg
1e240 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20  Hdr *pPgOld; .  
1e250 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65  int h;.  Pgno ne
1e260 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
1e270 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1e280 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41  nRef>0 );..  TRA
1e290 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE5("MOVE %d pag
1e2a0 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
1e2b0 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
1e2c0 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
1e2d0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1e2e0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
1e2f0 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69  ync, pgno);..  i
1e300 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
1e310 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
1e320 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
1e330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1e340 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  g->inJournal );.
1e350 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1e360 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
1e370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1e380 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
1e390 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
1e3a0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68  rom it's hash-ch
1e3b0 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
1e3c0 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
1e3d0 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
1e3e0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
1e3f0 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
1e400 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
1e410 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
1e420 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
1e430 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
1e440 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
1e450 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
1e460 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
1e470 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
1e480 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
1e490 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
1e4a0 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
1e4b0 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
1e4c0 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64  e..  */.  pPgOld
1e4d0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
1e4e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1e4f0 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
1e500 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
1e510 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  d->nRef==0 );.  
1e520 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
1e530 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64  n(pPager, pPgOld
1e540 29 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64  );.    pPgOld->d
1e550 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
1e560 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79  ( pPgOld->needSy
1e570 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
1e580 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f  rt( pPgOld->inJo
1e590 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70  urnal );.      p
1e5a0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1e5b0 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  1;.      pPg->ne
1e5c0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1e5d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e5e0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
1e5f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
1e600 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75  ange the page nu
1e610 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64  mber for pPg and
1e620 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
1e630 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61  the new hash-cha
1e640 69 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67  in. */.  pPg->pg
1e650 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
1e660 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f   pager_hash(pgno
1e670 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1e680 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20  >aHash[h] ){.   
1e690 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e6a0 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
1e6b0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Hash==0 );.    p
1e6c0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
1e6d0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
1e6e0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
1e6f0 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
1e700 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61  >aHash[h];.  pPa
1e710 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
1e720 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  pPg;.  pPg->pPre
1e730 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50  vHash = 0;..  pP
1e740 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
1e750 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1e760 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  he = 1;..  if( n
1e770 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
1e780 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
1e790 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
1e7a0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
1e7b0 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
1e7c0 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
1e7d0 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
1e7e0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
1e7f0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
1e800 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
1e810 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
1e820 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
1e830 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
1e840 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
1e850 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67   the .    ** Pag
1e860 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.aInJournal bi
1e870 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  t has been set. 
1e880 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
1e890 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61   remedied by loa
1e8a0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ding.    ** the 
1e8b0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
1e8c0 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
1e8d0 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
1e8e0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20  needSync flag.. 
1e8f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1e900 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1e910 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
1e920 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
1e930 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
1e940 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
1e950 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
1e960 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
1e970 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72      */.    int r
1e980 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  c;.    void *pNe
1e990 65 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65  edSync;.    asse
1e9a0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
1e9b0 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
1e9c0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1e9d0 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
1e9e0 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79  ncPgno, &pNeedSy
1e9f0 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  nc);.    if( rc!
1ea00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1ea10 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
1ea20 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
1ea30 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47  ;.    DATA_TO_PG
1ea40 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e  HDR(pNeedSync)->
1ea50 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1ea60 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28    DATA_TO_PGHDR(
1ea70 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f  pNeedSync)->inJo
1ea80 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44  urnal = 1;.    D
1ea90 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1eaa0 65 64 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d  edSync)->dirty =
1eab0 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70   1;.    sqlite3p
1eac0 61 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64  ager_unref(pNeed
1ead0 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Sync);.  }..  re
1eae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1eaf0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1eb00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1eb10 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1eb20 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
1eb30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
1eb40 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
1eb50 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20  e file lock for 
1eb60 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
1eb70 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
1eb80 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e  alue is one of N
1eb90 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
1eba0 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
1ebb0 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c  CK,.** PENDING_L
1ebc0 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56  OCK, or EXCLUSIV
1ebd0 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  E_LOCK..*/.int s
1ebe0 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b  qlite3pager_lock
1ebf0 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
1ec00 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ger){.  return s
1ec10 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74  qlite3OsLockStat
1ec20 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d  e(pPager->fd);.}
1ec30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1ec40 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1ec50 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
1ec60 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
1ec70 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
1ec80 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
1ec90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
1eca0 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67  ager_refdump(Pag
1ecb0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
1ecc0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
1ecd0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
1ece0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
1ecf0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1ed00 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
1ed10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ed20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1ed30 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
1ed40 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
1ed50 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
1ed60 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
1ed70 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
1ed80 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
1ed90 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
1eda0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
1edb0 2a 2f 0a                                         */.