/ Hex Artifact Content
Login

Artifact 6fbcc25f1f3fbe62cbbda3af3dbb9c3d758f8050:


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 33  : pager.c,v 1.23
0350: 33 20 32 30 30 36 2f 30 31 2f 30 39 20 30 39 3a  3 2006/01/09 09:
0360: 35 39 3a 34 39 20 64 61 6e 69 65 6c 6b 31 39 37  59:49 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 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
2460: 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c  r {.  u8 journal
2470: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2480: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
2490: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
24a0: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
24b0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
24c0: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
24d0: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
24e0: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
24f0: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
2500: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
2510: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
2520: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2530: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
2540: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
2550: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2560: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
2570: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
2580: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d  ocks */.  u8 stm
2590: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
25a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
25c0: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
25d0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
25e0: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
25f0: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
2600: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
2610: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
2620: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
2630: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
2640: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
2650: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
2660: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
2670: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
26a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
26b0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
26c0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
26d0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
26e0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
26f0: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
2700: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74  tness */.  u8 st
2710: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2720: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2730: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2740: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2750: 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b   */.  u8 errMask
2760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2770: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65    /* One of seve
2780: 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72  ral kinds of err
2790: 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ors */.  u8 temp
27a0: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
27b0: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
27c0: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
27d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
27e0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
27f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2800: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
2810: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
2820: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2830: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2840: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2850: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2860: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2870: 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20  dirtyCache;     
2880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2890: 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73   if cached pages
28a0: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f   have changed */
28b0: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
28c0: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
28d0: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
28e0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
28f0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
2900: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2920: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
2930: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
2940: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
2950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2960: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
2970: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2980: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e   to jrnl */.  in
2990: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
29a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
29c0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
29d0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
29e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
29f0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
2a00: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
2a10: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a30: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2a40: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
2a50: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2a60: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2a90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2aa0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
2ab0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
2ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
2ad0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
2ae0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
2af0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74  hecksum */.  int
2b00: 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20   stmtNRec;      
2b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b20: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
2b30: 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c   stmt subjournal
2b40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b60: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
2b70: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
2b80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2b90: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
2ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2bb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2bc0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
2bd0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2c00: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2c10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50  s */.  int nMaxP
2c20: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2c30: 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72     /* High water
2c40: 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a   mark of nPage *
2c50: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
2c80: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
2c90: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
2ca0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2cd0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2ce0: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2cf0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d10: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2d20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2d30: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2d40: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2d60: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2d70: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2d80: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
2d90: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
2da0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2db0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2dc0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
2dd0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2de0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2df0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
2e10: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
2e20: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
2e30: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
2e40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2e50: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a  .  OsFile *fd, *
2e60: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  jfd;           /
2e70: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2e80: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
2e90: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
2ea0: 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20   OsFile *stfd;  
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2ed0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
2ee0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
2ef0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
2f00: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
2f10: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2f20: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
2f30: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
2f40: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
2f50: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
2f60: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
2f70: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
2f80: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
2f90: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
2fa0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
2fb0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
2fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fd0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
2fe0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2ff0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
3000: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3010: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
3020: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
3030: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
3040: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
3050: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3060: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
3070: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3080: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
3090: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
30a0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
30b0: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
30c0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
30d0: 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20  i64 stmtHdrOff; 
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30f0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
3100: 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73  der written this
3110: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3120: 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20  i64 stmtCksum;  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
3140: 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74  ksumInit when st
3150: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
3160: 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ted */.  i64 stm
3170: 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  tJSize;         
3180: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3190: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
31a0: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
31b0: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
31c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
31d0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
31e0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
31f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3200: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
3210: 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20  , nMiss, nOvfl; 
3220: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
3230: 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20  s, missing, and 
3240: 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  LRU overflows */
3250: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72  .  int nRead,nWr
3260: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ite;           /
3270: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
3280: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
3290: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
32a0: 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f  *xDestructor)(vo
32b0: 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c  id*,int); /* Cal
32c0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
32d0: 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65  hen freeing page
32e0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  s */.  void (*xR
32f0: 65 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69  einiter)(void*,i
3300: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
3310: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3320: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
3330: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
3340: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
3350: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
3360: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
3370: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
3380: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
3390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
33a0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
33b0: 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20  o xCodec() */.  
33c0: 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50  PgHdr *aHash[N_P
33d0: 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48  G_HASH];    /* H
33e0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
33f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
3400: 50 67 48 64 72 20 2a 2f 0a 23 69 66 6e 64 65 66  PgHdr */.#ifndef
3410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3420: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
3430: 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20   Pager *pNext;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3450: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  Linked list of p
3460: 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68  agers in this th
3470: 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  read */.#endif.}
3480: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  ;../*.** If SQLI
3490: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
34a0: 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  ed then incremen
34b0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67  t the variable g
34c0: 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61  iven in.** the a
34d0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65  rgument.*/.#ifde
34e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20  f SQLITE_TEST.# 
34f0: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
3500: 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23  (x)  x++.#else.#
3510: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3520: 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  R(x).#endif../*.
3530: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74  ** These are bit
3540: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
3550: 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  t in Pager.errMa
3560: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  sk..**.** TODO: 
3570: 4d 61 79 62 65 20 77 65 20 6a 75 73 74 20 77 61  Maybe we just wa
3580: 6e 74 20 61 20 76 61 72 69 61 62 6c 65 20 2d 20  nt a variable - 
3590: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 43  Pager.errCode. C
35a0: 61 6e 20 77 65 20 72 65 61 6c 6c 79 20 0a 2a 2a  an we really .**
35b0: 20 20 20 20 20 20 20 68 61 76 65 20 74 77 6f 20         have two 
35c0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 65 72 72  simultaneous err
35d0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 3f 0a 2a  or conditions?.*
35e0: 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 69 6e 67 20  *.** Recovering 
35f0: 66 72 6f 6d 20 61 6e 20 53 51 4c 49 54 45 5f 46  from an SQLITE_F
3600: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ULL, SQLITE_LOCK
3610: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
3620: 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   or .** SQLITE_I
3630: 4f 45 52 52 20 65 72 72 6f 72 20 69 73 20 6e 6f  OERR error is no
3640: 74 20 61 20 73 69 6d 70 6c 65 20 6d 61 74 74 65  t a simple matte
3650: 72 2c 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20  r, particularly 
3660: 69 66 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a  if the pager .**
3670: 20 63 61 63 68 65 20 69 73 20 73 68 61 72 65 64   cache is shared
3680: 20 62 65 74 77 65 65 6e 20 6d 75 6c 74 69 70 6c   between multipl
3690: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
36a0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  *.** SQLITE_FULL
36b0: 20 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c   (PAGER_ERR_FULL
36c0: 29 3a 0a 2a 2a 20 20 20 20 20 43 6c 65 61 72 65  ):.**     Cleare
36d0: 64 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  d when the trans
36e0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
36f0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   back..**.** SQL
3700: 49 54 45 5f 43 4f 52 52 55 50 54 20 28 50 41 47  ITE_CORRUPT (PAG
3710: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 29 3a  ER_ERR_CORRUPT):
3720: 0a 2a 2a 20 20 20 20 20 43 61 6e 6e 6f 74 20 62  .**     Cannot b
3730: 65 20 63 6c 65 61 72 65 64 2e 20 54 68 65 20 75  e cleared. The u
3740: 70 70 65 72 20 6c 61 79 65 72 20 6d 75 73 74 20  pper layer must 
3750: 63 6c 6f 73 65 20 74 68 65 20 63 75 72 72 65 6e  close the curren
3760: 74 20 70 61 67 65 72 20 0a 2a 2a 20 20 20 20 20  t pager .**     
3770: 61 6e 64 20 6f 70 65 6e 20 61 20 6e 65 77 20 6f  and open a new o
3780: 6e 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  ne on the same f
3790: 69 6c 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ile to continue.
37a0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 50 52  .**.** SQLITE_PR
37b0: 4f 54 4f 43 4f 4c 20 28 50 41 47 45 52 5f 45 52  OTOCOL (PAGER_ER
37c0: 52 5f 4c 4f 43 4b 29 3a 0a 2a 2a 20 20 20 20 20  R_LOCK):.**     
37d0: 54 68 69 73 20 65 72 72 6f 72 20 6f 6e 6c 79 20  This error only 
37e0: 6f 63 63 75 72 73 20 69 66 20 61 6e 20 69 6e 74  occurs if an int
37f0: 65 72 6e 61 6c 20 65 72 72 6f 72 20 6f 63 63 75  ernal error occu
3800: 72 73 20 6f 72 20 61 6e 6f 74 68 65 72 20 70 72  rs or another pr
3810: 6f 63 65 73 73 20 0a 2a 2a 20 20 20 20 20 69 73  ocess .**     is
3820: 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
3830: 68 65 20 73 71 6c 69 74 65 20 6c 6f 63 6b 69 6e  he sqlite lockin
3840: 67 20 70 72 6f 74 6f 63 6f 6c 20 28 69 2e 65 2e  g protocol (i.e.
3850: 20 73 6f 6d 65 6f 6e 65 20 69 73 20 0a 2a 2a 20   someone is .** 
3860: 20 20 20 20 6d 61 6e 69 70 75 6c 61 74 69 6e 67      manipulating
3870: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3880: 6c 65 20 75 73 69 6e 67 20 73 6f 6d 65 74 68 69  le using somethi
3890: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 73 71  ng other than sq
38a0: 6c 69 74 65 29 2e 0a 2a 2a 20 20 20 20 20 54 68  lite)..**     Th
38b0: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  is is handled in
38c0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
38d0: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
38e0: 74 69 6f 6e 20 2d 20 74 68 65 20 65 72 72 6f 72  tion - the error
38f0: 20 0a 2a 2a 20 20 20 20 20 63 61 6e 6e 6f 74 20   .**     cannot 
3900: 62 65 20 63 6c 65 61 72 65 64 20 65 78 63 65 70  be cleared excep
3910: 74 20 62 79 20 63 6c 6f 73 69 6e 67 20 74 68 65  t by closing the
3920: 20 63 75 72 72 65 6e 74 20 70 61 67 65 72 20 61   current pager a
3930: 6e 64 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 20  nd opening .**  
3940: 20 20 20 61 20 62 72 61 6e 64 20 6e 65 77 20 6f     a brand new o
3950: 6e 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  ne on the same f
3960: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
3970: 45 5f 49 4f 45 52 52 20 28 50 41 47 45 52 5f 45  E_IOERR (PAGER_E
3980: 52 52 5f 44 49 53 4b 29 3a 0a 2a 2a 20 20 20 20  RR_DISK):.**    
3990: 20 43 6c 65 61 72 65 64 20 77 68 65 6e 20 74 68   Cleared when th
39a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
39b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
39c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
39d0: 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31  RR_FULL     0x01
39e0: 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66    /* a write() f
39f0: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
3a00: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3a10: 20 20 20 20 30 78 30 32 20 20 2f 2a 20 65 72 72      0x02  /* err
3a20: 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  or in the lockin
3a30: 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64  g protocol */.#d
3a40: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3a50: 43 4f 52 52 55 50 54 20 20 30 78 30 34 20 20 2f  CORRUPT  0x04  /
3a60: 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f  * database or jo
3a70: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
3a80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
3a90: 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30  R_ERR_DISK     0
3aa0: 78 30 38 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20  x08  /* general 
3ab0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d  disk I/O error -
3ac0: 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f   bad hard drive?
3ad0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e   */../*.** Journ
3ae0: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3af0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
3b00: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
3b10: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
3b20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
3b30: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
3b40: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
3b50: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
3b60: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
3b70: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
3b80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3b90: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3ba0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3bb0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3bc0: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3bd0: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3be0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3bf0: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3c00: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3c10: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3c20: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3c30: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
3c40: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
3c50: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3c60: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3c70: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
3c80: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3c90: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3ca0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3cb0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3cc0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3cd0: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3ce0: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3cf0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3d00: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3d10: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3d20: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3d30: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3d40: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3d50: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3d60: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3d70: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3d80: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3d90: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3da0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3db0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3dc0: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3dd0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3de0: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3df0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3e00: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3e10: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3e20: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3e30: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3e40: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3e50: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3e60: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3e70: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3e80: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3e90: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3ea0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3eb0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3ec0: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3ed0: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3ee0: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3ef0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3f00: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3f10: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3f20: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3f30: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3f40: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3f50: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3f60: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3f70: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3f80: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3f90: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3fa0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3fb0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3fc0: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3fd0: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3fe0: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3ff0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4000: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
4010: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
4020: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
4030: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
4040: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
4050: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
4060: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
4070: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
4080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
4090: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
40a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
40b0: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
40c0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
40d0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
40e0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
40f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
4100: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
4110: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
4120: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
4130: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
4140: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
4150: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
4160: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
4170: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
4180: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
4190: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
41a0: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
41b0: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
41c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
41d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
41e0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
41f0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
4200: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
4210: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
4220: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
4230: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
4240: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
4250: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4260: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4270: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4280: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4290: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
42a0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
42b0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
42c0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
42d0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
42e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
42f0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
4300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
4310: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
4320: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
4330: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
4340: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
4350: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
4360: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66   default size of
4370: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a   a disk sector.*
4380: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
4390: 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a  SECTOR_SIZE 512.
43a0: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
43b0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
43c0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
43d0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
43e0: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
43f0: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
4400: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
4410: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
4420: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
4430: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
4440: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
4450: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
4460: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
4470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
4480: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
4490: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
44a0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
44b0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
44c0: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
44d0: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
44e0: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
44f0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
4500: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
4510: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
4520: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4530: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
4540: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
4550: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
4560: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
4570: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
4580: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
4590: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
45a0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
45b0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
45c0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
45d0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
45e0: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
45f0: 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  Enable reference
4600: 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20   count tracking 
4610: 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20  (for debugging) 
4620: 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20  here:.*/.#ifdef 
4630: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
4640: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
4650: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
4660: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
4670: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
4680: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
4690: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
46a0: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
46b0: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
46c0: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
46d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
46e0: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
46f0: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
4700: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
4710: 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
4720: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a  ATA(p), p->nRef.
4730: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
4740: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
4750: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
4760: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
4770: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4780: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
4790: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
47a0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
47b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
47c0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
47d0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
47e0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
47f0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
4800: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
4810: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
4820: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4830: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
4840: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
4850: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4860: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4870: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
4880: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
4890: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
48a0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
48b0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
48c0: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
48d0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20 72   *pRes){.  u32 r
48e0: 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  es;.  int rc;.  
48f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
4900: 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a  ad(fd, &res, siz
4910: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28  eof(res));.  if(
4920: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4930: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
4940: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d  har ac[4];.    m
4950: 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20  emcpy(ac, &res, 
4960: 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61  4);.    res = (a
4970: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
4980: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
4990: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20  <<8) | ac[3];.  
49a0: 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b  }.  *pRes = res;
49b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
49c0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
49d0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
49e0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
49f0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
4a00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
4a10: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
4a20: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
4a30: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4a40: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
4a50: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
4a60: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
4a70: 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e  2 val){.  unsign
4a80: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4a90: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
4aa0: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  4) & 0xff;.  ac[
4ab0: 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  1] = (val>>16) &
4ac0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d   0xff;.  ac[2] =
4ad0: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
4ae0: 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20  ;.  ac[3] = val 
4af0: 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e  & 0xff;.  return
4b00: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
4b10: 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f  fd, ac, 4);.}../
4b20: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 33  *.** Write the 3
4b30: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 27 76  2-bit integer 'v
4b40: 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70 61 67  al' into the pag
4b50: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
4b60: 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a 20 27  page header.** '
4b70: 70 27 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  p' at offset 'of
4b80: 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  fset'..*/.static
4b90: 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74   void store32bit
4ba0: 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72  s(u32 val, PgHdr
4bb0: 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29   *p, int offset)
4bc0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4bd0: 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28  r *ac;.  ac = &(
4be0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
4bf0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4c00: 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63 5b  )[offset];.  ac[
4c10: 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26  0] = (val>>24) &
4c20: 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d   0xff;.  ac[1] =
4c30: 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66   (val>>16) & 0xf
4c40: 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61  f;.  ac[2] = (va
4c50: 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20  l>>8) & 0xff;.  
4c60: 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78  ac[3] = val & 0x
4c70: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ff;.}../*.** Rea
4c80: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
4c90: 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  er at offset 'of
4ca0: 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70  fset' from the p
4cb0: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
4cc0: 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72  y.** page header
4cd0: 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   'p'..*/.static 
4ce0: 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62 69  u32 retrieve32bi
4cf0: 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74  ts(PgHdr *p, int
4d00: 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69   offset){.  unsi
4d10: 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20  gned char *ac;. 
4d20: 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65   ac = &((unsigne
4d30: 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  d char*)PGHDR_TO
4d40: 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74  _DATA(p))[offset
4d50: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b  ];.  return (ac[
4d60: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
4d70: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
4d80: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a  8) | ac[3];.}...
4d90: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
4da0: 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50  e bits in the pP
4db0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e  ager->errMask in
4dc0: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65  to an approprate
4dd0: 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  .** return code.
4de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4df0: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67  ager_errcode(Pag
4e00: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
4e10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4e20: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
4e30: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4e40: 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72  _ERR_LOCK )    r
4e50: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
4e60: 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  COL;.  if( pPage
4e70: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
4e80: 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20  ER_ERR_DISK )   
4e90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
4ea0: 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  RR;.  if( pPager
4eb0: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4ec0: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20  R_ERR_FULL )    
4ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
4ee0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4ef0: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
4f00: 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63  ERR_CORRUPT ) rc
4f10: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
4f20: 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  T;.  return rc;.
4f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4f40: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
4f50: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
4f60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
4f70: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
4f80: 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65   code to set the
4f90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 69 74   appropriate bit
4fa0: 73 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  s in Pager.errMa
4fb0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
4fc0: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
4fd0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
4fe0: 20 72 63 29 7b 0a 20 20 73 77 69 74 63 68 28 20   rc){.  switch( 
4ff0: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
5000: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 0a  QLITE_PROTOCOL:.
5010: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
5020: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
5030: 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 62  RR_LOCK;.      b
5040: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5050: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 0a 20 20 20  QLITE_IOERR:.   
5060: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
5070: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
5080: 44 49 53 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  DISK;.      brea
5090: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
50a0: 54 45 5f 46 55 4c 4c 3a 0a 20 20 20 20 20 20 70  TE_FULL:.      p
50b0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
50c0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
50d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
50e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
50f0: 4f 52 52 55 50 54 3a 0a 20 20 20 20 20 20 70 50  ORRUPT:.      pP
5100: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
5110: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
5120: 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  PT;.      break;
5130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5140: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5150: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
5160: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
5170: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
5180: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
5190: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
51a0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
51b0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
51c0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
51d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
51e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
51f0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
5200: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
5210: 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72  TA(pPage);.  for
5220: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70  (i=0; i<pPage->p
5230: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
5240: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
5250: 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61  = (hash+i)^pData
5260: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
5270: 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n hash;.}../*.**
5280: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
5290: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
52a0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
52b0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
52c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
52d0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
52e0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
52f0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5300: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5310: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5320: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
5330: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
5340: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
5350: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
5360: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5370: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
5380: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
5390: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
53a0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
53b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
53c0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
53d0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
53e0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  | pPager->errMas
53f0: 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50  k || MEMDB || pP
5400: 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20  g->dirty || .   
5410: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
5420: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
5430: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
5440: 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  e.#define CHECK_
5450: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a  PAGE(x).#endif..
5460: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
5470: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
5480: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
5490: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
54a0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
54b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
54c0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
54d0: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
54e0: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
54f0: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
5500: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5510: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5520: 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69  c(). *pzMaster i
5530: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e  s.** set to poin
5540: 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  t at the memory 
5550: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
5560: 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
5570: 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74  er must.** sqlit
5580: 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65  eFree() *pzMaste
5590: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  r..**.** If no m
55a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
55b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
55c0: 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20  nt *pzMaster is 
55d0: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
55e0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
55f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
5600: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
5610: 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e  nal(OsFile *pJrn
5620: 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74  l, char **pzMast
5630: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
5640: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20   u32 len;.  i64 
5650: 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  szJ;.  u32 cksum
5660: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
5670: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
5680: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
5690: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
56a0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
56b0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
56c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
56d0: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
56e0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
56f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
5700: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
5710: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5720: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
5730: 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72  szJ-16);.  if( r
5740: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5750: 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63  eturn rc;. .  rc
5760: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5770: 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  rnl, &len);.  if
5780: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5790: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
57a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
57b0: 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a  pJrnl, &cksum);.
57c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
57d0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
57e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
57f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
5800: 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20  agic, 8);.  if( 
5810: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5820: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5830: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5840: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5860: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5870: 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  16-len);.  if( r
5880: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5890: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a  eturn rc;..  *pz
58a0: 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a  Master = (char *
58b0: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65  )sqliteMalloc(le
58c0: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
58d0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
58e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
58f0: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
5900: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
5910: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
5920: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5930: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5940: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5950: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5960: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ter = 0;.    ret
5970: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
5980: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
5990: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
59a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
59b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
59c0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
59d0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a  .    cksum -= (*
59e0: 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20  pzMaster)[i];.  
59f0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
5a00: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
5a10: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
5a20: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
5a30: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
5a40: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
5a50: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
5a60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5a70: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
5a80: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
5a90: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
5aa0: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
5ab0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
5ac0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
5ad0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
5ae0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
5af0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
5b00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72   */.    sqliteFr
5b10: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
5b20: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
5b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
5b40: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
5b50: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
5b60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5b70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
5b80: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
5b90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
5ba0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
5bb0: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
5bc0: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
5bd0: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
5be0: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
5bf0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
5c00: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
5c10: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
5c20: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
5c30: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
5c40: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
5c50: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
5c60: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
5c70: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ca0: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5cc0: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5ce0: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5d00: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
5d30: 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e  ic int seekJourn
5d40: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
5d50: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
5d60: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
5d70: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5d80: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
5d90: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
5da0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
5db0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
5dc0: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
5dd0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
5de0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
5df0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5e00: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
5e10: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
5e30: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
5e40: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5e50: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
5e60: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
5e70: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
5e80: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
5e90: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
5ea0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a  urnalOff);.}../*
5eb0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5ec0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
5ed0: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
5ee0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
5ef0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
5f00: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
5f10: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
5f20: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
5f30: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
5f40: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
5f50: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
5f60: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
5f70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
5f80: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
5f90: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
5fa0: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
5fb0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
5fc0: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
5fd0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
5fe0: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
5ff0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
6000: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
6010: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
6020: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
6030: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
6040: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
6050: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
6060: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
6070: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
6080: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6090: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
60a0: 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  rnal..** .** Fol
60b0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
60c0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62  L_HDR_SZ - 24) b
60d0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
60e0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
60f0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
6100: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
6110: 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20  r){..  int rc = 
6120: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6130: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
6140: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6150: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6160: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
6170: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
6180: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
6190: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ff==0 ){.    pPa
61a0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
61b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
61c0: 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67  lHdr;.  }.  pPag
61d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
61e0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
61f0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
6200: 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20  FIX ME: .  **.  
6210: 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20  ** Possibly for 
6220: 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e  a pager not in n
6230: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  o-sync mode, the
6240: 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73   journal magic s
6250: 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  hould not.  ** b
6260: 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20  e written until 
6270: 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69  nRec is filled i
6280: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78  n as part of nex
6290: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e  t syncJournal().
62a0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75   .  **.  ** Actu
62b0: 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77  ally maybe the w
62c0: 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  hole journal hea
62d0: 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65  der should be de
62e0: 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74  layed until that
62f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69  .  ** point. Thi
6300: 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20  nk about this.. 
6310: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
6320: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6330: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
6340: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
6350: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
6360: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6370: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
6380: 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46   nRec Field. 0xF
6390: 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73  FFFFFFF for no-s
63a0: 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ync journals. */
63b0: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
63c0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
63d0: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  d, pPager->noSyn
63e0: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
63f0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
6400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6410: 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f      /* The rando
6420: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6430: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20  tialiser */ .   
6440: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
6450: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
6460: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
6470: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6480: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  );.    rc = writ
6490: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
64a0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  jfd, pPager->cks
64b0: 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69  umInit);.  }.  i
64c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
64d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69   ){.    /* The i
64e0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
64f0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  size */.    rc =
6500: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
6510: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
6520: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ->dbSize);.  }. 
6530: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6540: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
6550: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
6560: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
6570: 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20  ocess */.    rc 
6580: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
6590: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
65a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
65b0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f    }..  /* The jo
65c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
65d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75   been written su
65e0: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b  ccessfully. Seek
65f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
6600: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
6610: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
6620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6630: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a  er sector..  */.
6640: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6650: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6660: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
6670: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6680: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
6690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
66a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
66b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
66c0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
66d0: 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20  , "\000", 1);.  
66e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
66f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
6710: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
6720: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
6730: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
6740: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
6750: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
6760: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
6770: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
6780: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
6790: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
67a0: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
67b0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
67c0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
67d0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
67e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
67f0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
6800: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
6810: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
6820: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
6830: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6840: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
6850: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
6860: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
6870: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6880: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
6890: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
68a0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
68b0: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
68c0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
68d0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
68e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
68f0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
6900: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
6910: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
6920: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
6930: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
6940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6950: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
6960: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
6970: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
6980: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
6990: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
69a0: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
69b0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
69c0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
69d0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
69e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
69f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
6a00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
6a10: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
6a20: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
6a30: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
6a40: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
6a50: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
6a60: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
6a70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
6a80: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6a90: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
6aa0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
6ab0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
6ac0: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
6ad0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
6ae0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6af0: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
6b00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
6b10: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6b20: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
6b30: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6b40: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
6b50: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6b60: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
6b70: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
6b80: 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69  of(aMagic));.  i
6b90: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6ba0: 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  c;..  if( memcmp
6bb0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6bc0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6bd0: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
6be0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6bf0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
6c00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6c10: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
6c20: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6c30: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6c40: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6c50: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
6c60: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
6c70: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6c80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
6c90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6ca0: 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  d, pDbSize);.  i
6cb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6cc0: 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  c;..  /* Update 
6cd0: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
6ce0: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
6cf0: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
6d00: 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f  by .  ** the pro
6d10: 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
6d20: 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
6d30: 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
6d40: 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  was.  ** created
6d50: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
6d60: 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
6d70: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
6d80: 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69  tine.  ** is bei
6d90: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
6da0: 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  ithin pager_play
6db0: 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61  back(). The loca
6dc0: 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  l value.  ** of 
6dd0: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
6de0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
6df0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
6e00: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
6e10: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6e20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
6e30: 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63  2 *)&pPager->sec
6e40: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
6e50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6e60: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6e70: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
6e80: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
6e90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6ea0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
6eb0: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6ec0: 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  alOff);.  return
6ed0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
6ee0: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
6ef0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
6f00: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
6f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
6f20: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
6f30: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
6f40: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
6f50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6f60: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
6f70: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
6f80: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
6f90: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
6fa0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
6fb0: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
6fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
6fd0: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
6fe0: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
6ff0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
7000: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
7010: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
7020: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
7030: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
7040: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
7050: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
7060: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
7070: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
7080: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
7090: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
70a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
70b0: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
70c0: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
70d0: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
70e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
70f0: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
7100: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
7110: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
7120: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
7130: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
7140: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
7150: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
7160: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
7170: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
7180: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
7190: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
71a0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
71b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
71c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
71d0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
71e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
71f0: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
7200: 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ; .  u32 cksum =
7210: 20 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61   0; ..  if( !zMa
7220: 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ster || pPager->
7230: 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72  setMaster) retur
7240: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
7250: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
7260: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
7270: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a  trlen(zMaster);.
7280: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
7290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
72a0: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m += zMaster[i];
72b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
72c0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
72d0: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
72e0: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
72f0: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
7300: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
7310: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
7320: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
7330: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
7340: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
7350: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
7360: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
7370: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
7380: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
7390: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65   ){.    rc = see
73a0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
73b0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
73c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
73d0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
73e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
73f0: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
7400: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
7410: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50  s(pPager->jfd, P
7420: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
7430: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ger));.  if( rc!
7440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7450: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
7460: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7470: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
7480: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
7490: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
74b0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
74c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e  pPager->jfd, len
74d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
74e0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
74f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  rc;..  rc = writ
7500: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
7510: 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69  jfd, cksum);.  i
7520: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7530: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
7550: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
7560: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7570: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7580: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
7590: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
75a0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
75b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
75c0: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
75d0: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
75e0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
75f0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7600: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7610: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7620: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7630: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7640: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
7650: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
7660: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
7670: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
7680: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
7690: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
76a0: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
76b0: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
76c0: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
76d0: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
76e0: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
76f0: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
7700: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7710: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
7720: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
7730: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
7740: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
7750: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
7760: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
7770: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
7780: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
7790: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
77a0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
77b0: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
77c0: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
77d0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
77e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
77f0: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
7800: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7810: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
7820: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7830: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7840: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7850: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
7860: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
7870: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
7880: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
7890: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
78a0: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
78b0: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
78c0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
78d0: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
78e0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
78f0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
7900: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7910: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
7920: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
7930: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
7940: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7950: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
7960: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
7970: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7980: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7990: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
79a0: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
79b0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
79c0: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
79d0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
79e0: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
79f0: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
7a00: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7a10: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
7a20: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
7a30: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
7a40: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
7a50: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
7a60: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
7a70: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
7a80: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
7a90: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7aa0: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
7ab0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7ac0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7ad0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7ae0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7af0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7b00: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
7b10: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
7b20: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
7b30: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
7b40: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7b50: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
7b60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7b70: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
7b80: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
7b90: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
7ba0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
7bb0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7bc0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7bd0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7be0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
7bf0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
7c00: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
7c10: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
7c20: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
7c30: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
7c40: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7c50: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
7c60: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
7c70: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
7c80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7c90: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
7ca0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7cb0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
7cc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
7cd0: 72 4d 61 73 6b 20 29 20 72 65 74 75 72 6e 3b 0a  rMask ) return;.
7ce0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7cf0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7d00: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
7d10: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
7d20: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
7d30: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
7d40: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7d50: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
7d60: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
7d70: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
7d80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
7d90: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
7da0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
7db0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
7dc0: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
7dd0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7de0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7df0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7e00: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7e10: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7e20: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7e30: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7e40: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7e50: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
7e60: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
7e70: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
7e80: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
7e90: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
7ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7ec0: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7ed0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7ee0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7ef0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7f00: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7f10: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7f20: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7f30: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7f40: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7f50: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7f60: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7f70: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7f80: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7f90: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7fa0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7fb0: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7fc0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7fd0: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7fe0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7ff0: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
8000: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
8010: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
8020: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
8030: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
8040: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
8050: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
8060: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
8070: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
8080: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8090: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
80a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
80b0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
80c0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
80d0: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
80e0: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
80f0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
8100: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8110: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
8120: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
8130: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
8140: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
8150: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
8160: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
8170: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
8180: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
8190: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
81a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
81b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
81c0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
81d0: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
81e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
81f0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
8200: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
8210: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
8220: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
8230: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
8240: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
8250: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
8260: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
8270: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
8280: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
8290: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
82a0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
82b0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
82c0: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
82d0: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
82e0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
82f0: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
8300: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
8310: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
8320: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
8330: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
8340: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
8350: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
8360: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
8370: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
8380: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
8390: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
83a0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
83b0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
83c0: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63  l==0 );.  }.  rc
83d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
83e0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
83f0: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70  HARED_LOCK);.  p
8400: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
8410: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70  AGER_SHARED;.  p
8420: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
8430: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
8440: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
8450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8460: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
8470: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
8480: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
8490: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   of data..**.** 
84a0: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
84b0: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74  al checksum.  It
84c0: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
84d0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
84e0: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
84f0: 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  l value and the 
8500: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65  page number.  We
8510: 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69   experimented wi
8520: 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d  th.** a checksum
8530: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64   of the entire d
8540: 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61  ata, but that wa
8550: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f  s found to be to
8560: 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o slow..**.** No
8570: 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
8580: 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65   number is store
8590: 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  d at the beginni
85a0: 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a  ng of data and.*
85b0: 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * the checksum i
85c0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
85d0: 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d  end.  This is im
85e0: 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75  portant.  If jou
85f0: 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69  rnal.** corrupti
8600: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
8610: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
8620: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
8630: 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73  y scenario.** is
8640: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
8650: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
8660: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
8670: 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73   changed.  It is
8680: 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69  .** much less li
8690: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
86a0: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
86b0: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
86c0: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
86d0: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
86e0: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
86f0: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
8700: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
8710: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
8720: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
8730: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
8740: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
8750: 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a  n..**.** FIX ME:
8760: 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e    Consider addin
8770: 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f  g every 200th (o
8780: 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68  r so) byte of th
8790: 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a  e data to the.**
87a0: 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74   checksum.  That
87b0: 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65   way if a single
87c0: 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72   page spans 3 or
87d0: 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f   more disk secto
87e0: 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74  rs and.** only t
87f0: 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72  he middle sector
8800: 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20   is corrupt, we 
8810: 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20  will still have 
8820: 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20  a reasonable.** 
8830: 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e  chance of failin
8840: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61  g the checksum a
8850: 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e  nd thus detectin
8860: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a  g the problem..*
8870: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
8880: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
8890: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
88a0: 6f 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  o, const u8 *aDa
88b0: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
88c0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
88d0: 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Init;.  int i = 
88e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
88f0: 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69  -200;.  while( i
8900: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
8910: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
8920: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
8930: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
8940: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
8950: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
8960: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8970: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
8980: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
8990: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
89a0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
89b0: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
89c0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
89d0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
89e0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
89f0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
8a00: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
8a10: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
8a20: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
8a30: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
8a40: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
8a50: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
8a60: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
8a70: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
8a80: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
8a90: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
8aa0: 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b   *jfd, int useCk
8ab0: 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sum){.  int rc;.
8ac0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
8af0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
8b00: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b20: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8b30: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
8b40: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
8b50: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b70: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
8b80: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
8b90: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74  ing */.  u8 aDat
8ba0: 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  a[SQLITE_MAX_PAG
8bb0: 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d  E_SIZE];  /* Tem
8bc0: 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20  p storage for a 
8bd0: 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73  page */..  /* us
8be0: 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65  eCksum should be
8bf0: 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61   true for the ma
8c00: 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66  in journal and f
8c10: 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74  alse for.  ** st
8c20: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
8c30: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
8c40: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
8c50: 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73  e case.  */.  as
8c60: 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73  sert( jfd == (us
8c70: 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d  eCksum ? pPager-
8c80: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
8c90: 74 66 64 29 20 29 3b 0a 0a 0a 20 20 72 63 20 3d  tfd) );...  rc =
8ca0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
8cb0: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
8cc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8cd0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
8ce0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
8cf0: 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50 61 67  fd, &aData, pPag
8d00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
8d10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8d20: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8d30: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8d40: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
8d50: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
8d60: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
8d70: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
8d80: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
8d90: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
8da0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
8db0: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
8dc0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
8dd0: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
8de0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
8df0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
8e00: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
8e10: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
8e20: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
8e30: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
8e40: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
8e50: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
8e60: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
8e70: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
8e80: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
8e90: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
8ea0: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
8eb0: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8ed0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
8ee0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
8ef0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
8f00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8f10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
8f20: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
8f30: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8f40: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
8f50: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
8f60: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
8f70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
8f80: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
8f90: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
8fa0: 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 21 3d 63   pgno, aData)!=c
8fb0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
8fc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8fd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
8fe0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
8ff0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
9000: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
9010: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9020: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
9030: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
9040: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
9050: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
9060: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
9070: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
9080: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
9090: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
90a0: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
90b0: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
90c0: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
90d0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
90e0: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
90f0: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
9100: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
9110: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
9120: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
9130: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
9140: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
9150: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
9160: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
9170: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
9180: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
9190: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
91a0: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
91b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
91c0: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
91d0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
91e0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
91f0: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
9200: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
9210: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
9220: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
9230: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
9240: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
9250: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
9260: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
9270: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
9280: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
9290: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
92a0: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
92b0: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
92c0: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
92d0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
92e0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
92f0: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
9300: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
9310: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
9320: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
9330: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   in the main rol
9340: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
9350: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
9360: 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41  if a full ROLLBA
9370: 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  CK occurs after 
9380: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
9390: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
93a0: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69  full ROLLBACK wi
93b0: 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74  ll not restore t
93c0: 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f  he page to its o
93d0: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e  riginal.  ** con
93e0: 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69  tent.  Two condi
93f0: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65  tions must be me
9400: 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
9410: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9420: 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29  .  ** files. (1)
9430: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
9440: 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28  st be locked.  (
9450: 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
9460: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
9470: 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  * page content i
9480: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
9490: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
94a0: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
94b0: 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63   not in.  ** cac
94c0: 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  he or else it is
94d0: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
94e0: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
94f0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
9500: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
9510: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9520: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9530: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
9540: 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28  !=0 );.  TRACE3(
9550: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
9560: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
9570: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b  (pPager), pgno);
9580: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9590: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
95a0: 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30  USIVE && (pPg==0
95b0: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
95c0: 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20  c==0) ){.    rc 
95d0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
95e0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
95f0: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
9600: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9610: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9620: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
9630: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9640: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
9650: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9660: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
9670: 69 66 28 20 70 50 67 20 29 20 70 50 67 2d 3e 64  if( pPg ) pPg->d
9680: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
9690: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
96a0: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
96b0: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
96c0: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
96d0: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
96e0: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
96f0: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
9700: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
9710: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
9720: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
9730: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
9740: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
9750: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
9760: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
9770: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
9780: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
9790: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
97a0: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
97b0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
97c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
97d0: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
97e0: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
97f0: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
9800: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
9810: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
9820: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
9830: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
9840: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
9850: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
9860: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9870: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
9880: 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a  estructor ){  /*
9890: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75  ** FIX ME:  Shou
98a0: 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e  ld this be xRein
98b0: 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70  it? ***/.      p
98c0: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
98d0: 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
98e0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
98f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9900: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
9910: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
9920: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
9930: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
9940: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
9950: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
9960: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
9970: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
9980: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
9990: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
99a0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
99b0: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
99c0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
99d0: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
99e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
99f0: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
9a00: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
9a10: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
9a20: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
9a30: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
9a40: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
9a50: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
9a60: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
9a70: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9a80: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9a90: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
9aa0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
9ab0: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
9ac0: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
9ad0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9ae0: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
9af0: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
9b00: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
9b10: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
9b20: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
9b30: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
9b40: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
9b50: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
9b60: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
9b70: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
9b80: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
9b90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9ba0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
9bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9bc0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
9bd0: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
9be0: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
9bf0: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
9c00: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
9c10: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
9c20: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
9c30: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
9c40: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
9c50: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
9c60: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
9c70: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
9c80: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
9c90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
9ca0: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
9cb0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
9cc0: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
9cd0: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
9ce0: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
9cf0: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
9d00: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
9d10: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
9d20: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9d30: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
9d40: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
9d50: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
9d60: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9d70: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
9d80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9d90: 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65  OsFileSize(maste
9da0: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
9db0: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
9dc0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
9dd0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
9de0: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
9df0: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
9e00: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
9e10: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
9e20: 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  tr = 0;..    /* 
9e30: 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
9e40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9e50: 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
9e60: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
9e70: 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63   ** sqliteMalloc
9e80: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
9e90: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
9ea0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
9eb0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
9ec0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
9ed0: 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
9ee0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
9ef0: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
9f00: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
9f10: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9f20: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
9f30: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
9f40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
9f50: 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  ad(master, zMast
9f60: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
9f70: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9f80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9f90: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9fa0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
9fb0: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
9fc0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
9fd0: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
9fe0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
9ff0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
a000: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a010: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f  OsFileExists(zJo
a020: 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  urnal) ){.      
a030: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
a040: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
a050: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
a060: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
a070: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
a080: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
a090: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
a0a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a0b0: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
a0c0: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
a0d0: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
a0e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a0f0: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
a100: 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20  .        OsFile 
a110: 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  *journal = 0;.  
a120: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20        int c;..  
a130: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a140: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
a150: 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72  (zJournal, &jour
a160: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
a170: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a180: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
a190: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
a1a0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
a1b0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
a1c0: 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e  terJournal(journ
a1d0: 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29  al, &zMasterPtr)
a1e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a1f0: 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61  3OsClose(&journa
a200: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
a210: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a220: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a230: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
a240: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
a250: 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
a260: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
a270: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
a280: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73  r)==0;.        s
a290: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
a2a0: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rPtr);.        i
a2b0: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
a2c0: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
a2d0: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
a2e0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
a2f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
a300: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
a310: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a330: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
a340: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
a350: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
a360: 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73  }.  .  sqlite3Os
a370: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
a380: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
a390: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
a3a0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
a3b0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a  iteFree(zMasterJ
a3c0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
a3d0: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
a3e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a3f0: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
a400: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
a420: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
a430: 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69  e cache agree wi
a440: 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
a450: 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  sk.  In other wo
a460: 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74  rds,.** reread t
a470: 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74  he disk to reset
a480: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
a490: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
a4a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a4b0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f  alled after a ro
a4c0: 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20  llback in which 
a4d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74  some of the dirt
a4e0: 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73  y cache.** pages
a4f0: 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20   had never been 
a500: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64  written out to d
a510: 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  isk.  We need to
a520: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
a530: 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20  * cache content 
a540: 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20  and the easiest 
a550: 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69  way to do that i
a560: 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
a570: 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62  old content.** b
a580: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ack from the dis
a590: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a5a0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
a5b0: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
a5c0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
a5d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a5e0: 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50  ITE_OK;.  for(pP
a5f0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
a600: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
a610: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61  extAll){.    cha
a620: 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41  r zBuf[SQLITE_MA
a630: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20  X_PAGE_SIZE];.  
a640: 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74    if( !pPg->dirt
a650: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
a660: 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
a670: 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
a680: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
a690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a6a0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
a6b0: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
a6c0: 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70  ize*(i64)(pPg->p
a6d0: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69  gno-1));.      i
a6e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a6f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a700: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
a710: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
a720: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a730: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a740: 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54 43    TRACE3("REFETC
a750: 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
a760: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
a770: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
a780: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
a790: 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  ak;.      CODEC(
a7a0: 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50  pPager, zBuf, pP
a7b0: 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20  g->pgno, 2);.   
a7c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
a7d0: 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50  mset(zBuf, 0, pP
a7e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a7f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a800: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d  Pg->nRef==0 || m
a810: 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44  emcmp(zBuf, PGHD
a820: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
a830: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a840: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
a850: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
a860: 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67  pPg), zBuf, pPag
a870: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a880: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
a890: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
a8a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
a8b0: 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
a8c0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
a8d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a8e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a8f0: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
a900: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
a910: 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
a920: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
a930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
a940: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
a950: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
a960: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
a970: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
a980: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
a990: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
a9a0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
a9b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
a9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
a9d0: 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20  e the main file 
a9e0: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
a9f0: 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  er to the number
aa00: 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64   of pages.** ind
aa10: 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  icated..*/.stati
aa20: 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
aa30: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
aa40: 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  er, int nPage){.
aa50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa60: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
aa70: 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 72 65  XCLUSIVE );.  re
aa80: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72  turn sqlite3OsTr
aa90: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
aaa0: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
aab0: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b  ize*(i64)nPage);
aac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
aad0: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
aae0: 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
aaf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ab00: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
ab10: 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
ab20: 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
ab30: 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
ab40: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
ab50: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
ab60: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
ab70: 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
ab80: 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
ab90: 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
aba0: 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
abb0: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
abc0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
abd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
abe0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
abf0: 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
ac00: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
ac10: 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
ac20: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
ac30: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
ac40: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
ac50: 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
ac60: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
ac70: 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
ac80: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
ac90: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
aca0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
acb0: 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
acc0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
acd0: 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
ace0: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
acf0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
ad00: 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
ad10: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
ad20: 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
ad30: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
ad40: 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69  *  (5)  4 byte i
ad50: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
ad60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
ad70: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
ad80: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
ad90: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
ada0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
adb0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
adc0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
add0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
ade0: 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20  al.).**  (6)  N 
adf0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
ae00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ae10: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
ae20: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
ae30: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
ae40: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
ae50: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
ae60: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
ae70: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
ae80: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
ae90: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
aea0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
aeb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
aec0: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
aed0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
aee0: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
aef0: 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a  TF-8..**  (7)  Z
af00: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
af10: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
af20: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
af30: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
af40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
af50: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
af60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
af70: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
af80: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
af90: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
afa0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
afb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
afc0: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
afd0: 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62  first 6 items ab
afe0: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
aff0: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
b000: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
b010: 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d   of the 7th item
b020: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
b030: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
b040: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
b050: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
b060: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
b070: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
b080: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
b090: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
b0a0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
b0b0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
b0c0: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
b0d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
b0e0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
b0f0: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
b100: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
b110: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
b120: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
b130: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
b140: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
b150: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
b160: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
b170: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
b180: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
b190: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
b1a0: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
b1b0: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
b1c0: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
b1d0: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
b1e0: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
b1f0: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
b200: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
b210: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
b220: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
b230: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
b240: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
b250: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
b260: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
b270: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
b280: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
b290: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
b2a0: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
b2b0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
b2c0: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
b2d0: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
b2e0: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
b2f0: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
b300: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
b310: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
b320: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
b330: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
b340: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
b350: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
b360: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
b370: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
b380: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
b390: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
b3a0: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
b3b0: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
b3c0: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
b3d0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
b3e0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
b3f0: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
b400: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
b410: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
b420: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
b430: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
b440: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
b450: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
b460: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
b470: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
b480: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
b490: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
b4a0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
b4b0: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
b4c0: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
b4d0: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
b4e0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
b4f0: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
b500: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
b510: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
b520: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
b530: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
b540: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
b550: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
b560: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
b570: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
b580: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b5a0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
b5b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
b5c0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
b5d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b5e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
b5f0: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
b600: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
b610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b620: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
b630: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
b640: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
b650: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
b660: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
b670: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
b680: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
b690: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
b6a0: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
b6b0: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
b6c0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
b6d0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
b6e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b6f0: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
b700: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
b710: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
b720: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
b730: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
b740: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
b750: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
b760: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
b770: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
b780: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
b790: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
b7a0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
b7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b7c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
b7d0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
b7e0: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
b7f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b800: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
b810: 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
b820: 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
b830: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
b840: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
b850: 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
b860: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
b870: 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
b880: 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
b890: 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
b8a0: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
b8b0: 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
b8c0: 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
b8d0: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
b8e0: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
b8f0: 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a  jfd, &zMaster);.
b900: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
b910: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
b920: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b930: 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20   || (zMaster && 
b940: 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78  !sqlite3OsFileEx
b950: 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29  ists(zMaster)) )
b960: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
b970: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a  (zMaster);.    z
b980: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
b990: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
b9a0: 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
b9b0: 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  E_OK;.    goto e
b9c0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
b9d0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
b9e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
b9f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
ba00: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
ba10: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
ba20: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
ba30: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
ba40: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
ba50: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
ba60: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
ba70: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
ba80: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
ba90: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
baa0: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
bab0: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
bac0: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
bad0: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
bae0: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
baf0: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
bb00: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
bb10: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
bb20: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
bb30: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
bb40: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
bb50: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
bb60: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
bb70: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
bb80: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
bb90: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
bba0: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
bbb0: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
bbc0: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
bbd0: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
bbe0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
bbf0: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
bc00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bc10: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
bc20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bc30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
bc40: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bc50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bc60: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
bc70: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
bc80: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
bc90: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
bca0: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
bcb0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
bcc0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
bcd0: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
bce0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
bcf0: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
bd00: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
bd10: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
bd20: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
bd30: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
bd40: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
bd50: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
bd60: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
bd70: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
bd80: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
bd90: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
bda0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
bdb0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
bdc0: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
bdd0: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
bde0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bdf0: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
be00: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
be10: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
be20: 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
be30: 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
be40: 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
be50: 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
be60: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
be70: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
be80: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
be90: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
bea0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
beb0: 55 53 49 56 45 20 26 26 20 0a 20 20 20 20 20 20  USIVE && .      
bec0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bed0: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
bee0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
bef0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
bf00: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
bf10: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
bf20: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
bf30: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
bf40: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
bf50: 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
bf60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bf70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
bf80: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bf90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bfa0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
bfb0: 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
bfc0: 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69 74 65    /* rc = sqlite
bfd0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
bfe0: 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  jfd, JOURNAL_HDR
bff0: 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 20 2a 2f  _SZ(pPager)); */
c000: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c010: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
c020: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 0a 20  d_playback;.  . 
c030: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
c040: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
c050: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
c060: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
c070: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
c080: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
c090: 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
c0a0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
c0b0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
c0c0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
c0d0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
c0e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c0f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
c100: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
c110: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
c120: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c130: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
c140: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
c150: 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
c160: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
c170: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
c180: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
c190: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c1a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
c1b0: 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20 68 61  /* Pages that ha
c1c0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
c1d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  to the journal b
c1e0: 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65 64 0a  ut never synced.
c1f0: 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74 20 72    ** where not r
c200: 65 73 74 6f 72 65 64 20 62 79 20 74 68 65 20 6c  estored by the l
c210: 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65 20 68  oop above.  We h
c220: 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ave to restore t
c230: 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hose.  ** pages 
c240: 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 6d 20  by reading them 
c250: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6f 72  back from the or
c260: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e  iginal database.
c270: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c280: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
c290: 0a 20 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  .  pager_reload_
c2a0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 0a  cache(pPager);..
c2b0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
c2c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c2d0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
c2e0: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
c2f0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
c300: 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( zMaster ){.  
c310: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
c320: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
c330: 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
c340: 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
c350: 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65  true,.    ** see
c360: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
c370: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
c380: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
c390: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c3a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c3b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
c3c0: 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73  r_delmaster(zMas
c3d0: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
c3e0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
c3f0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
c400: 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
c410: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
c420: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
c430: 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
c440: 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
c450: 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
c460: 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
c470: 20 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52   different PAGER
c480: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a  _SECTOR_SIZE.  *
c490: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
c4a0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
c4b0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
c4c0: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
c4d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
c4e0: 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f  ze = PAGER_SECTO
c4f0: 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  R_SIZE;.  return
c500: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
c510: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
c520: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
c530: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
c540: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
c550: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
c560: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
c570: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
c580: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
c590: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
c5a0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
c5b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c5c0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
c5d0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
c5e0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
c5f0: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
c600: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
c610: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
c620: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
c630: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
c640: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
c650: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
c660: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c670: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
c680: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
c690: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
c6a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c6b0: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
c6c0: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
c6d0: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
c6e0: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
c6f0: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
c700: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
c710: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
c720: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
c730: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
c740: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
c750: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
c760: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
c770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c780: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
c790: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7b0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
c7c0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
c7d0: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
c7e0: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
c7f0: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
c800: 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
c810: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
c820: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
c830: 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20  jfd, &os_szJ);. 
c840: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c850: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
c860: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
c870: 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d  J==os_szJ );.  }
c880: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
c890: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
c8a0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c8b0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
c8c0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20  eader written.  
c8d0: 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ** this statemen
c8e0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  t transaction, o
c8f0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
c900: 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
c910: 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
c920: 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
c930: 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
c940: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
c950: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c960: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
c970: 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
c980: 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
c990: 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
c9a0: 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
c9b0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
c9c0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
c9d0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
c9e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
c9f0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
ca00: 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
ca10: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
ca20: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
ca30: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  tmtSize);.  }.  
ca40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
ca50: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
ca60: 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
ca70: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
ca80: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
ca90: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
caa0: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
cab0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
cac0: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
cad0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
cae0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
caf0: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
cb00: 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
cb10: 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
cb20: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
cb30: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
cb40: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
cb50: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
cb60: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
cb70: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
cb80: 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
cb90: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
cba0: 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
cbb0: 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
cbc0: 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
cbd0: 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
cbe0: 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
cbf0: 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
cc00: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
cc10: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
cc20: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
cc30: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
cc40: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
cc50: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66  ger, pPager->stf
cc60: 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 0);.    asser
cc70: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cc80: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
cc90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
cca0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
ccb0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
ccc0: 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61  Now roll some pa
ccd0: 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  ges back from th
cce0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
ccf0: 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d  urnal. Pager.stm
cd00: 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20  tJSize.  ** was 
cd10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
cd20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
cd30: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
cd40: 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f   was started, so
cd50: 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67  .  ** everything
cd60: 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64   after that need
cd70: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
cd80: 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f  ack, either into
cd90: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
cda0: 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  se, the memory c
cdb0: 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20  ache, or both.. 
cdc0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69   **.  ** If it i
cdd0: 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
cde0: 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66   Pager.stmtHdrOf
cdf0: 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  f is the offset 
ce00: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
ce10: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a  * of the first j
ce20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
ce30: 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69  itten during thi
ce40: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
ce50: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
ce60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
ce70: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
ce80: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
ce90: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
cea0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
ceb0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
cec0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
ced0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
cee0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  = pPager->stmtJS
cef0: 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
cf00: 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65  ksumInit = pPage
cf10: 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20  r->stmtCksum;.  
cf20: 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f  assert( JOURNAL_
cf30: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28  HDR_SZ(pPager)<(
cf40: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cf50: 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  +8) );.  while( 
cf60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cf70: 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70  ff <= (hdrOff-(p
cf80: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
cf90: 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  8)) ){.    rc = 
cfa0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
cfb0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
cfc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
cfd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
cfe0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
cff0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d000: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
d010: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d020: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
d030: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d040: 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
d050: 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20  2 nRec;.    u32 
d060: 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
d070: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
d080: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
d090: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
d0a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d0b0: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
d0c0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
d0d0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
d0e0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d0f0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
d100: 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nRec==0 ){.   
d110: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
d120: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d130: 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
d140: 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
d150: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65   }.    for(i=nRe
d160: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
d170: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d180: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
d190: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d1a0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d1b0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d1c0: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
d1d0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d1e0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
d1f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d200: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d210: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
d220: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
d230: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
d240: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
d250: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
d260: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d270: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
d280: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
d290: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
d2a0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
d2b0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
d2c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d2d0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
d2e0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
d2f0: 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
d300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
d310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
d320: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
d330: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
d340: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
d350: 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
d360: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
d370: 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65  t_cachesize(Page
d380: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
d390: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
d3a0: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
d3b0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
d3c0: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
d3d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
d3e0: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
d3f0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
d400: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
d410: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
d420: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
d430: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
d440: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
d450: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
d460: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
d470: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
d480: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
d490: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
d4a0: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
d4b0: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
d4c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
d4d0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
d4e0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
d4f0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
d500: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
d510: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
d520: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
d530: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
d540: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
d550: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
d560: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
d570: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d580: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
d590: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
d5a0: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
d5b0: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
d5c0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
d5d0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
d5e0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
d5f0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
d610: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
d620: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
d630: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
d640: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
d650: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
d660: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
d670: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
d680: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
d690: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
d6a0: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
d6b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
d6c0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
d6d0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
d6e0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d6f0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d710: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
d720: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
d730: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
d740: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
d750: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
d760: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
d770: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
d780: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
d790: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
d7a0: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
d7b0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
d7c0: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
d7d0: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
d7e0: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
d7f0: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
d800: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
d820: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
d830: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
d840: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
d850: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d860: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
d870: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
d880: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
d890: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
d8a0: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
d8b0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
d8c0: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
d8d0: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
d8e0: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
d8f0: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
d900: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
d910: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
d920: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
d930: 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67  safety_level(Pag
d940: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d950: 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65 72  level){.  pPager
d960: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
d970: 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
d980: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
d990: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
d9a0: 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
d9b0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
d9c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
d9d0: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
d9e0: 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
d9f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
da00: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
da10: 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
da20: 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
da30: 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
da40: 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
da50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
da60: 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
da70: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
da80: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
da90: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
daa0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
dab0: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
dac0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20   0;../*.** Open 
dad0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
dae0: 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  .  Write the nam
daf0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  e of the file in
db00: 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20 28 7a 46 69  to zFile.** (zFi
db10: 6c 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  le must be at le
db20: 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ast SQLITE_TEMPN
db30: 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c  AME_SIZE bytes l
db40: 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20  ong.)  Write.** 
db50: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
db60: 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52  tor into *fd.  R
db70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
db80: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f  on success or so
db90: 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f  me.** other erro
dba0: 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
dbb0: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20  l..**.** The OS 
dbc0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
dbd0: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
dbe0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
dbf0: 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  n it is.** close
dc00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
dc10: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
dc20: 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69  entemp(char *zFi
dc30: 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 46 64  le, OsFile **pFd
dc40: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38  ){.  int cnt = 8
dc50: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
dc60: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
dc70: 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
dc80: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
dc90: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
dca0: 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d  /.  do{.    cnt-
dcb0: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  -;.    sqlite3Os
dcc0: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69  TempFileName(zFi
dcd0: 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
dce0: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
dcf0: 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c  sive(zFile, pFd,
dd00: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
dd10: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
dd20: 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
dd30: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
dd40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
dd50: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
dd60: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
dd70: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
dd80: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
dd90: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
dda0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
ddb0: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
ddc0: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
ddd0: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
dde0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
ddf0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70  call to sqlite3p
de00: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
de10: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
de20: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
de30: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
de40: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
de50: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
de60: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
de70: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
de80: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
de90: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
dea0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
deb0: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
dec0: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
ded0: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
dee0: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
def0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
df00: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
df10: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
df20: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
df30: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
df40: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
df50: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
df60: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
df70: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
df80: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
df90: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
dfa0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
dfb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
dfc0: 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65  ger_open(.  Page
dfd0: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
dfe0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
dff0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e000: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
e010: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e020: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
e030: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e040: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
e050: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
e060: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
e070: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
e080: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
e090: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
e0a0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
e0b0: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
e0c0: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
e0d0: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
e0e0: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
e0f0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
e100: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
e110: 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65  ameLen;.  OsFile
e120: 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *fd;.  int rc =
e130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e140: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
e150: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
e160: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
e170: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
e180: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
e190: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
e1a0: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
e1b0: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
e1c0: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
e1d0: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
e1e0: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
e1f0: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
e200: 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 6e 64 65 66  E_SIZE];.#ifndef
e210: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
e220: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
e230: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
e240: 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
e250: 64 44 61 74 61 28 29 3b 0a 23 65 6e 64 69 66 0a  dData();.#endif.
e260: 0a 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28  .  /* If malloc(
e270: 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61  ) has already fa
e280: 69 6c 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49  iled return SQLI
e290: 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65  TE_NOMEM. Before
e2a0: 20 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69   even.  ** testi
e2b0: 6e 67 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74  ng for this, set
e2c0: 20 2a 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c   *ppPager to NUL
e2d0: 4c 20 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  L so the caller 
e2e0: 6b 6e 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a  knows the pager.
e2f0: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77    ** structure w
e300: 61 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74  as never allocat
e310: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50  ed. .  */.  *ppP
e320: 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ager = 0;.  if( 
e330: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
e340: 61 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  a()->mallocFaile
e350: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
e360: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e370: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20  }.  memset(&fd, 
e380: 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a  0, sizeof(fd));.
e390: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
e3a0: 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65  ager file and se
e3b0: 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t zFullPathname 
e3c0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c  to point at mall
e3d0: 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d  oc()ed .  ** mem
e3e0: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
e3f0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65  he complete file
e400: 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75  name (i.e. inclu
e410: 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  ding the directo
e420: 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ry)..  */.  if( 
e430: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
e440: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66  lename[0] ){.#if
e450: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e460: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
e470: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
e480: 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
e490: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
e4a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c   = 1;.      zFul
e4b0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e4c0: 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20  teStrDup("");.  
e4d0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
e4e0: 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c     {.      zFull
e4f0: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e500: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e510: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
e520: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
e530: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
e540: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e550: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
e560: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
e570: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
e580: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
e590: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
e5a0: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
e5b0: 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  p(zTemp, &fd);. 
e5c0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
e5d0: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
e5e0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e5f0: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e600: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
e610: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e620: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
e630: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
e640: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
e650: 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
e660: 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f  cture. As part o
e670: 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63  f the same alloc
e680: 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a  ation, allocate.
e690: 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
e6a0: 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66  he full paths of
e6b0: 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63   the file, direc
e6c0: 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  tory and journal
e6d0: 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46   .  ** (Pager.zF
e6e0: 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a  ilename, Pager.z
e6f0: 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61  Directory and Pa
e700: 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20  ger.zJournal).. 
e710: 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50   */.  if( zFullP
e720: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e  athname ){.    n
e730: 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
e740: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e750: 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
e760: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
e770: 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
e780: 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
e790: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
e7a0: 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
e7b0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
e7c0: 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65  ocks above, free
e7d0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a   the memory .  *
e7e0: 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
e7f0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66  zFullPathname, f
e800: 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ree the Pager st
e810: 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
e820: 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65  e the .  ** file
e830: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
e840: 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  r is not allocat
e850: 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ed there is no n
e860: 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a  eed to set .  **
e870: 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61   any Pager.errMa
e880: 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  sk variables..  
e890: 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  */.  if( !pPager
e8a0: 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61   || !zFullPathna
e8b0: 6d 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  me || rc!=SQLITE
e8c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
e8d0: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
e8e0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
e8f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e900: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
e910: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
e920: 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
e930: 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
e940: 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43  rc);.  }..  TRAC
e950: 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
e960: 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
e970: 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  fd), zFullPathna
e980: 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  me);.  pPager->z
e990: 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
e9a0: 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
e9b0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e9c0: 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46  ry = &pPager->zF
e9d0: 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b  ilename[nameLen+
e9e0: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
e9f0: 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
ea00: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d  ->zDirectory[nam
ea10: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70  eLen+1];.  strcp
ea20: 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
ea30: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
ea40: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50  me);.  strcpy(pP
ea50: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
ea60: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
ea70: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  ;..  for(i=nameL
ea80: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
ea90: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
eaa0: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
eab0: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
eac0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
ead0: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
eae0: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
eaf0: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
eb00: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
eb10: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
eb20: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
eb30: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
eb40: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
eb50: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
eb60: 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = fd;.  pPager->
eb70: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
eb80: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
eb90: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
eba0: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
ebb0: 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
ebc0: 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
ebd0: 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70  && readOnly;.  p
ebe0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
ebf0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
ec00: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
ec10: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
ec20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
ec30: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
ec40: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ec50: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
ec60: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70  T_PAGE_SIZE;.  p
ec70: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
ec80: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
ec90: 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20  tmtJSize = 0;.  
eca0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
ecb0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61  0;.  pPager->nMa
ecc0: 78 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  xPage = 0;.  pPa
ecd0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
ece0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  0;.  pPager->sta
ecf0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
ed00: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  K;.  pPager->err
ed10: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  Mask = 0;.  pPag
ed20: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
ed30: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
ed40: 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
ed50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
ed60: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
ed70: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
ed80: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
ed90: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
eda0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
edb0: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
edc0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
edd0: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
ede0: 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
edf0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
ee00: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
ee10: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
ee20: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
ee30: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
ee40: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
ee50: 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61  T(nExtra);.  pPa
ee60: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
ee70: 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  = PAGER_SECTOR_S
ee80: 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  IZE;.  pPager->p
ee90: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
eea0: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
eeb0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
eec0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
eed0: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
eee0: 20 70 50 61 67 65 72 3b 0a 23 69 66 6e 64 65 66   pPager;.#ifndef
eef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
ef00: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
ef10: 20 69 66 28 20 70 54 73 64 2d 3e 75 73 65 4d 65   if( pTsd->useMe
ef20: 6d 6f 72 79 4d 61 6e 61 67 65 6d 65 6e 74 20 29  moryManagement )
ef30: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e  {.    pPager->pN
ef40: 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67  ext = pTsd->pPag
ef50: 65 72 3b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50  er;.    pTsd->pP
ef60: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
ef70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
ef80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ef90: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
efa0: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
efb0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
efc0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
efd0: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
efe0: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
eff0: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
f000: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
f010: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
f020: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
f030: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
f040: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
f050: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
f060: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
f070: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
f080: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
f090: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
f0a0: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
f0b0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
f0c0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
f0d0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
f0e0: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
f0f0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
f100: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
f110: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
f120: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
f130: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
f140: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
f150: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
f160: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
f170: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
f180: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
f190: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
f1a0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
f1b0: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
f1c0: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
f1d0: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
f1e0: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
f1f0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
f200: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
f210: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
f220: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
f230: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
f240: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
f250: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
f260: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
f270: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
f280: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
f290: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
f2a0: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
f2b0: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
f2c0: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
f2d0: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
f2e0: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
f2f0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
f300: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
f310: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
f320: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
f330: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
f340: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
f350: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
f360: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
f370: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
f380: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
f390: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
f3a0: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
f3b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
f3c0: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
f3d0: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
f3e0: 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
f3f0: 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
f400: 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
f410: 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
f420: 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
f430: 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
f440: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
f450: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
f460: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a  ager_set_pagesiz
f470: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
f480: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
f490: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
f4a0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
f4b0: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
f4c0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
f4d0: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
f4e0: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
f4f0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
f500: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
f510: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
f520: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
f530: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
f540: 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
f550: 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
f560: 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
f570: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
f580: 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
f590: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
f5a0: 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
f5b0: 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
f5c0: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
f5d0: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
f5e0: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
f5f0: 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
f600: 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
f610: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
f620: 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
f630: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
f640: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
f650: 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
f660: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
f670: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
f680: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
f690: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
f6a0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
f6b0: 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65  ed_cnt;.void cle
f6c0: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
f6d0: 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74  error(){.  sqlit
f6e0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20  e3_io_error_hit 
f6f0: 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61  = 0;.}.void disa
f700: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f710: 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
f720: 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
f730: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
f740: 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
f750: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f760: 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
f770: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
f780: 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
f790: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
f7a0: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
f7b0: 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
f7c0: 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f  .# define clear_
f7d0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f7e0: 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69  or().# define di
f7f0: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
f800: 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
f810: 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
f820: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
f830: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f840: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
f850: 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
f860: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
f870: 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
f880: 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
f890: 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
f8a0: 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
f8b0: 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
f8c0: 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
f8d0: 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
f8e0: 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
f8f0: 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
f900: 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
f910: 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
f920: 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
f930: 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
f940: 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
f950: 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
f960: 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
f970: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
f980: 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
f990: 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
f9a0: 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
f9b0: 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
f9c0: 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
f9d0: 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
f9e0: 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
f9f0: 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
fa00: 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
fa10: 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s)..*/.void sqli
fa20: 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69  te3pager_read_fi
fa30: 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
fa40: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
fa50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
fa60: 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  est){.  memset(p
fa70: 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
fa80: 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
fa90: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
faa0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  (pPager->fd, 0);
fab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65  .    sqlite3OsRe
fac0: 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
fad0: 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 63 6c  Dest, N);.    cl
fae0: 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ear_simulated_io
faf0: 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 7d 0a  _error();.  }.}.
fb00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
fb10: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
fb20: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
fb30: 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
fb40: 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
fb50: 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  er. .**.** If th
fb60: 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c  e PENDING_BYTE l
fb70: 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
fb80: 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74  directly after t
fb90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
fba0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73   file, then cons
fbb0: 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70  ider this page p
fbc0: 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
fbd0: 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  too. For example
fbe0: 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  , if.** PENDING_
fbf0: 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39  BYTE is byte 409
fc00: 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  6 (the first byt
fc10: 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64  e of page 5) and
fc20: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
fc30: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36  .** file is 4096
fc40: 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74   bytes, 5 is ret
fc50: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66  urned instead of
fc60: 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   4..*/.int sqlit
fc70: 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
fc80: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
fc90: 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73 73  {.  i64 n;.  ass
fca0: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
fcb0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
fcc0: 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
fcd0: 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53   n = pPager->dbS
fce0: 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ize;.  } else {.
fcf0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
fd00: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
fd10: 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54  ->fd, &n)!=SQLIT
fd20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
fd30: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
fd40: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b   PAGER_ERR_DISK;
fd50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
fd60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
fd70: 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
fd80: 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
fd90: 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
fda0: 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
fdb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fdc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
fdd0: 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
fde0: 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
fdf0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
fe00: 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
fe10: 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
fe20: 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
fe30: 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
fe40: 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74    n++;.  }.  ret
fe50: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
fe60: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
fe70: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
fe80: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
fe90: 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55  ger*);.../*.** U
fea0: 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
feb0: 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
fec0: 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67  Also set the pag
fed0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f  e number to 0 to
fee0: 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61   indicate.** tha
fef0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
ff00: 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  t part of any ha
ff10: 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69  sh chain. This i
ff20: 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
ff30: 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  se the.** sqlite
ff40: 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28  3pager_movepage(
ff50: 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65  ) routine can le
ff60: 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68  ave a page in th
ff70: 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f  e .** pNextFree/
ff80: 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74  pPrevFree list t
ff90: 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72  hat is not a par
ffa0: 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68  t of any hash-ch
ffb0: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
ffc0: 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  oid unlinkHashCh
ffd0: 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ain(Pager *pPage
ffe0: 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  r, PgHdr *pPg){.
fff0: 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
10000 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
10010 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
10020 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
10030 69 73 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  is page is not i
10040 6e 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  n any hash chain
10050 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
10060 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
10070 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
10080 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
10090 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
100a0 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
100b0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
100c0 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73  vHash ){.    ass
100d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
100e0 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 50  sh[pager_hash(pP
100f0 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50 67 20 29  g->pgno)]!=pPg )
10100 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
10110 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
10120 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
10130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10140 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73  nt h = pager_has
10150 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  h(pPg->pgno);.  
10160 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10170 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20  ->aHash[h]==pPg 
10180 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
10190 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70  Hash[h] = pPg->p
101a0 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 0a 20  NextHash;.  }.. 
101b0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
101c0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
101d0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
101e0 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h = 0;.}../*.** 
101f0 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72  Unlink a page fr
10200 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
10210 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c   (the list of al
10220 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  l pages where nR
10230 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72  ef==0).** and fr
10240 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c  om its hash coll
10250 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a  ision chain..*/.
10260 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
10270 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  nkPage(PgHdr *pP
10280 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
10290 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
102a0 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68  r;..  /* Keep th
102b0 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20 70  e pFirstSynced p
102c0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
102d0 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79 6e  at the first syn
102e0 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a  chronized page *
102f0 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61  /.  if( pPg==pPa
10300 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10310 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  d ){.    PgHdr *
10320 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
10330 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ee;.    while( p
10340 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
10350 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
10360 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65  ree; }.    pPage
10370 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
10380 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = p;.  }..  /* U
10390 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66  nlink from the f
103a0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28  reelist */.  if(
103b0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
103c0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  ){.    pPg->pPre
103d0 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
103e0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
103f0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
10400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10410 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20  pFirst==pPg );. 
10420 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
10430 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
10440 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ee;.  }.  if( pP
10450 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
10460 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
10470 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
10480 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
10490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
104a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61  ert( pPager->pLa
104b0 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
104c0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
104d0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
104e0 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46   }.  pPg->pNextF
104f0 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
10500 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Free = 0;..  /* 
10510 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
10520 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20  pgno hash table 
10530 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
10540 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
10550 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
10560 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
10570 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  DB./*.** This ro
10580 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
10590 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d   truncate an in-
105a0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
105b0 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20    Delete.** all 
105c0 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
105d0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
105e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
105f0 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
10600 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  ed..** Reference
10610 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
10620 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
10630 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
10640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
10650 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67  moryTruncate(Pag
10660 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
10670 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48  gHdr *pPg;.  PgH
10680 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74  dr **ppPg;.  int
10690 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
106a0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50  ->dbSize;..  ppP
106b0 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c  g = &pPager->pAl
106c0 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67  l;.  while( (pPg
106d0 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a   = *ppPg)!=0 ){.
106e0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
106f0 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  o<=dbSize ){.   
10700 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
10710 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
10720 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  lse if( pPg->nRe
10730 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  f>0 ){.      mem
10740 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
10750 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
10760 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
10770 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
10780 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
10790 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
107a0 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  g = pPg->pNextAl
107b0 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  l;.      unlinkP
107c0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
107d0 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
107e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
107f0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
10800 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
10810 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  e memoryTruncate
10820 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (p).#endif../*.*
10830 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
10840 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
10850 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
10860 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
10870 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
10880 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
10890 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
108a0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
108b0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
108c0 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
108d0 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
108e0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
108f0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
10900 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
10910 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
10920 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
10930 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
10940 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
10950 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
10960 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
10970 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
10980 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
10990 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
109a0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
109b0 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
109c0 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
109d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
109e0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
109f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
10a00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
10a10 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
10a20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
10a30 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
10a40 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
10a50 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
10a60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
10a70 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
10a80 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
10a90 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
10aa0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
10ab0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10ac0 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
10ad0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10ae0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10af0 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
10b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10b10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10b20 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66  * Truncate the f
10b30 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ile to the numbe
10b40 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69  r of pages speci
10b50 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
10b60 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
10b70 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
10b80 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
10b90 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
10ba0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
10bb0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
10bc0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
10bd0 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
10be0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
10bf0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
10c00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
10c10 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
10c20 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
10c30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10c40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
10c50 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
10c60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
10c70 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f   nPage;.    memo
10c80 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
10c90 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r);.    return S
10ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10cb0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
10cc0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
10cd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10cf0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e    }..  /* Get an
10d00 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
10d10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
10d20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e  before truncatin
10d30 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  g. */.  rc = pag
10d40 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
10d50 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
10d60 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
10d70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10d80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10d90 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72   }..  rc = pager
10da0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
10db0 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  , nPage);.  if( 
10dc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10dd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
10de0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d  ize = nPage;.  }
10df0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10e00 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
10e10 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
10e20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
10e30 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
10e40 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
10e50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
10e60 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
10e70 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
10e80 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
10e90 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
10ea0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
10eb0 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
10ec0 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
10ed0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
10ee0 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
10ef0 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
10f00 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
10f10 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
10f20 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
10f30 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
10f40 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
10f50 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
10f60 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
10f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
10f80 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
10f90 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
10fa0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
10fb0 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
10fc0 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
10fd0 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
10fe0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
10ff0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
11000 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
11010 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
11020 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
11030 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
11040 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
11050 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
11060 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
11070 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
11080 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
11090 67 2c 20 2a 70 4e 65 78 74 3b 0a 23 69 66 6e 64  g, *pNext;.#ifnd
110a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
110b0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
110c0 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
110d0 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
110e0 65 61 64 44 61 74 61 28 29 3b 0a 23 65 6e 64 69  eadData();.#endi
110f0 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  f..  switch( pPa
11100 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
11110 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53    case PAGER_RES
11120 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  ERVED:.    case 
11130 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20  PAGER_SYNCED: . 
11140 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58     case PAGER_EX
11150 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CLUSIVE: {.     
11160 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e   /* We ignore an
11170 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74  y IO errors that
11180 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
11190 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20  e rollback.     
111a0 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
111b0 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72  o disable IO err
111c0 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f  or simulation so
111d0 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20   that testing.  
111e0 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72      ** works mor
111f0 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20  e easily..      
11200 2a 2f 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  */.      disable
11210 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11220 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 73 71  rors();.      sq
11230 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
11240 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11250 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
11260 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11270 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44  .      if( !MEMD
11280 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  B ){.        sql
11290 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
112a0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
112b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
112c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
112d0 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 70 50 61 67  >errMask || pPag
112e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
112f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
11300 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
11310 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20  e PAGER_SHARED: 
11320 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  {.      if( !MEM
11330 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
11340 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
11350 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
11360 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
11370 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11380 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
11390 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
113a0 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
113b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
113c0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
113d0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
113e0 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  xt){.#ifndef NDE
113f0 42 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  BUG.    if( MEMD
11400 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  B ){.      PgHis
11410 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
11420 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
11430 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
11440 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
11450 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
11460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11470 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
11480 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
11490 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
114a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
114b0 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
114c0 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
114d0 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
114e0 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25   TRACE2("CLOSE %
114f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
11500 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ager));.  assert
11510 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
11520 6b 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  k || (pPager->jo
11530 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
11540 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
11550 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
11560 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
11570 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
11580 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
11590 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
115a0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
115b0 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  aInJournal);.  i
115c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
115d0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
115e0 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
115f0 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
11600 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
11610 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
11620 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
11630 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
11640 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
11650 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
11660 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
11670 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
11680 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
11690 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
116a0 20 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51    */..#ifndef SQ
116b0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
116c0 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
116d0 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
116e0 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65  r from the linke
116f0 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73  d list of pagers
11700 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20   starting at .  
11710 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70 50  ** ThreadData.pP
11720 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  ager if memory-m
11730 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
11740 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bled..  */.  if(
11750 20 70 54 73 64 2d 3e 75 73 65 4d 65 6d 6f 72 79   pTsd->useMemory
11760 4d 61 6e 61 67 65 6d 65 6e 74 20 29 7b 0a 20 20  Management ){.  
11770 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54    if( pPager==pT
11780 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  sd->pPager ){.  
11790 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72      pTsd->pPager
117a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
117b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
117c0 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a     Pager *pTmp;.
117d0 20 20 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d        for(pTmp =
117e0 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70   pTsd->pPager; p
117f0 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67  Tmp->pNext!=pPag
11800 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  er; pTmp=pTmp->p
11810 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 70 54 6d  Next);.      pTm
11820 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  p->pNext = pPage
11830 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
11840 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
11850 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
11860 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11870 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
11880 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
11890 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
118a0 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
118b0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61  /.Pgno sqlite3pa
118c0 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76  ger_pagenumber(v
118d0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
118e0 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54  gHdr *p = DATA_T
118f0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
11900 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
11910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
11920 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69  age_ref() functi
11930 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  on increments th
11940 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
11950 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a  t for a page..**
11960 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
11970 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
11980 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
11990 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
119a0 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
119b0 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
119c0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
119d0 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20  ** For non-test 
119e0 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
119f0 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74  f() is a macro t
11a00 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f  hat calls _page_
11a10 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20  ref().** online 
11a20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
11a30 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20   count is zero. 
11a40 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d   For test system
11a50 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s, page_ref().**
11a60 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74   is a real funct
11a70 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63  ion so that we c
11a80 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e  an set breakpoin
11a90 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e  ts and trace it.
11aa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11ab0 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
11ac0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
11ad0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
11ae0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
11af0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
11b00 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
11b10 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ve it. */.    if
11b20 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67  ( pPg==pPg->pPag
11b30 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11b40 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
11b50 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
11b60 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ree;.      while
11b70 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
11b80 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
11b90 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
11ba0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
11bb0 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
11bc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
11bd0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
11be0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
11bf0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
11c00 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11c10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11c20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
11c30 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
11c40 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
11c50 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
11c60 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
11c70 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11c80 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11c90 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
11ca0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11cb0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
11cc0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11cd0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
11ce0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
11cf0 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
11d00 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
11d10 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
11d20 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63  E_DEBUG.  static
11d30 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50   void page_ref(P
11d40 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20  gHdr *pPg){.    
11d50 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
11d60 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f   ){.      _page_
11d70 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ref(pPg);.    }e
11d80 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11d90 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45  nRef++;.      RE
11da0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
11db0 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  }.  }.#else.# de
11dc0 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29  fine page_ref(P)
11dd0 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30     ((P)->nRef==0
11de0 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76  ?_page_ref(P):(v
11df0 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29  oid)(P)->nRef++)
11e00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
11e10 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
11e20 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
11e30 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
11e40 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
11e50 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
11e60 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
11e70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
11e80 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44  ger_ref(void *pD
11e90 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
11ea0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
11eb0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67  DR(pData);.  pag
11ec0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
11ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
11ef0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f  e journal.  In o
11f00 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
11f10 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
11f20 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
11f30 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
11f40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
11f50 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
11f60 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
11f70 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20  f the.** disk.  
11f80 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
11f90 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69  o modify the ori
11fa0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
11fb0 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a  ile until after.
11fc0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
11fd0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  as been synced. 
11fe0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
11ff0 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64   database is mod
12000 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ified before.** 
12010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
12020 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65  ynced and a powe
12030 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
12040 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a  , the unsynced j
12050 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77  ournal.** data w
12060 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64  ould be lost and
12070 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61   we would be una
12080 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ble to completel
12090 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a  y rollback the.*
120a0 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
120b0 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  es.  Database co
120c0 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f  rruption would o
120d0 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  ccur..** .** Thi
120e0 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75  s routine also u
120f0 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20  pdates the nRec 
12100 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61  field in the hea
12110 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
12120 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d  al..** (See comm
12130 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ents on the page
12140 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
12150 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
12160 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
12170 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63  ).** If the sync
12180 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74   mode is FULL, t
12190 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63  wo syncs will oc
121a0 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20  cur.  First the 
121b0 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  whole journal.**
121c0 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e   is synced, then
121d0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
121e0 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e  is updated, then
121f0 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f   a second sync o
12200 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ccurs..**.** For
12210 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
12220 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  ases, we do not 
12230 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61  care if we are a
12240 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  ble to rollback.
12250 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  ** after a power
12260 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e   failure, so syn
12270 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
12280 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  This routine cle
12290 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ars the needSync
122a0 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
122b0 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c  page current hel
122c0 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a  d in.** memory..
122d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
122e0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
122f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
12300 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
12310 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
12320 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
12330 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
12340 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
12350 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
12360 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
12370 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
12380 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
12390 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
123a0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
123b0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
123c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
123d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
123e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
123f0 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  pen );.      /* 
12400 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
12410 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f  >noSync ); // no
12420 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65  Sync might be se
12430 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  t if synchronous
12440 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75  .      ** was tu
12450 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74  rned off after t
12460 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
12470 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63  as started.  Tic
12480 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e  ket #615 */.#ifn
12490 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
124a0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   {.        /* Ma
124b0 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67  ke sure the pPag
124c0 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72  er->nRec counter
124d0 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20   we are keeping 
124e0 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a  agrees.        *
124f0 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  * with the nRec 
12500 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
12510 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
12520 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
12530 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12540 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  64 jSz;.        
12550 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
12560 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
12570 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20  fd, &jSz);.     
12580 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
12590 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
125a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
125b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53  ->journalOff==jS
125c0 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
125d0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
125e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
125f0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
12600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12610 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
12620 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
12630 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
12640 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
12650 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
12660 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
12670 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
12680 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
12690 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
126a0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
126b0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
126c0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
126d0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
126e0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
126f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
12700 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
12710 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22          TRACE2("
12720 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
12730 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
12740 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
12750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12760 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
12770 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
12780 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
12790 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
127a0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
127b0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
127c0 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20  ger->jfd,.      
127d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
127f0 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
12800 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
12810 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12820 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12830 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
12840 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
12850 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  fd, pPager->nRec
12860 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12870 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
12880 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12890 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
128a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
128b0 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
128c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
128d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
128e0 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
128f0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
12900 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
12910 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72 63  ager));.      rc
12920 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
12930 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
12940 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b  ager->fullSync);
12950 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
12960 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12970 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
12980 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
12990 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
129a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
129b0 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
129c0 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
129d0 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
129e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
129f0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
12a00 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
12a10 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
12a20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
12a30 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
12a40 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
12a50 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
12a60 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
12a70 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
12a80 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
12a90 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
12aa0 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
12ab0 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
12ac0 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
12ad0 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
12ae0 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
12af0 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
12b00 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
12b10 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
12b20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
12b30 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
12b40 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
12b50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12b60 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
12b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
12b80 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
12b90 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
12ba0 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
12bb0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
12bc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
12bd0 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
12be0 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
12bf0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
12c00 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
12c10 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
12c20 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
12c30 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
12c40 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
12c50 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
12c60 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
12c70 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
12c80 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
12c90 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
12ca0 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
12cb0 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
12cc0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
12cd0 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
12ce0 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
12cf0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
12d00 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
12d10 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
12d20 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
12d30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
12d40 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
12d50 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
12d60 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
12d70 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
12d80 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
12d90 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
12da0 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
12db0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
12dc0 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
12dd0 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
12de0 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
12df0 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
12e00 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
12e10 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
12e20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
12e30 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
12e40 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
12e50 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
12e60 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
12e70 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
12e80 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
12e90 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
12ea0 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
12eb0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
12ec0 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
12ed0 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
12ee0 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
12ef0 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
12f00 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
12f10 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
12f20 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
12f30 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
12f40 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
12f50 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
12f60 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
12f70 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
12f80 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
12f90 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
12fa0 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
12fb0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
12fc0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
12fd0 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
12fe0 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
12ff0 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
13000 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
13010 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
13020 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
13030 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
13040 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
13050 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
13060 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
13070 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
13080 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
13090 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
130a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
130b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
130c0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  }..  while( pLis
130d0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
130e0 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
130f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13100 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
13110 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
13120 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
13130 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13140 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13150 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  rc;.    /* If th
13160 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
13170 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
13180 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
13190 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
131a0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
131b0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
131c0 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65  eans sqlite3page
131d0 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73  r_truncate() was
131e0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
131f0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
13200 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
13210 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
13220 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
13230 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
13240 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
13250 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
13260 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
13270 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
13280 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43 4f  Size ){.      CO
13290 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
132a0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
132b0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
132c0 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
132d0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
132e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
132f0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
13300 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
13310 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
13320 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
13330 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
13340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
13360 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
13370 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
13380 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
13390 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
133a0 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
133b0 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
133c0 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
133d0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
133e0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
133f0 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52    TRACE3("NOSTOR
13400 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
13410 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13420 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
13430 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13440 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13450 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
13460 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
13470 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
13480 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
13490 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
134a0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
134b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
134c0 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
134d0 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
134e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
134f0 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
13500 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
13510 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
13520 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
13530 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
13540 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
13550 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
13560 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
13570 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
13580 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
13590 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
135a0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
135b0 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
135c0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
135d0 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c  *p, *pList;.  pL
135e0 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ist = 0;.  for(p
135f0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
13600 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
13610 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72  {.    if( p->dir
13620 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ty ){.      p->p
13630 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20  Dirty = pList;. 
13640 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a       pList = p;.
13650 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13660 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
13670 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
13680 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
13690 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
136a0 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
136b0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
136c0 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
136d0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
136e0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
136f0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
13700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13710 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
13720 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
13730 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
13740 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
13750 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
13760 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
13770 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
13780 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
13790 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
137a0 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
137b0 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
137c0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
137d0 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
137e0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
137f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
13800 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
13810 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
13820 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nal) ) return 0;
13830 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
13840 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
13850 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  k(pPager->fd) ) 
13860 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
13870 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
13880 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d  ecount(pPager)==
13890 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
138a0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
138b0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
138c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
138d0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
138e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
138f0 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
13900 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
13910 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c  at can be recycl
13920 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ed. .**.** This 
13930 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75  routine may retu
13940 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  rn SQLITE_IOERR,
13950 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20   SQLITE_FULL or 
13960 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a  SQLITE_OK. It .*
13970 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74  * does not set t
13980 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
13990 73 6b 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  sk variable..*/.
139a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
139b0 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a  _recycle(Pager *
139c0 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63  pPager, int sync
139d0 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  Ok, PgHdr **ppPg
139e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
139f0 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
13a00 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
13a10 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
13a20 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
13a30 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
13a40 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
13a50 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
13a60 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
13a70 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50  .  */.  pPg = pP
13a80 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
13a90 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ed;..  /* If we 
13aa0 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
13ab0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
13ac0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
13ad0 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74  sync().  ** on t
13ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13af0 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
13b00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
13b10 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72  is is a.  ** ver
13b20 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
13b30 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
13b40 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
13b50 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
13b60 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
13b70 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  elped..  */.  if
13b80 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67  ( pPg==0 && pPag
13b90 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79  er->pFirst && sy
13ba0 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b  ncOk && !MEMDB){
13bb0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
13bc0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
13bd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
13be0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13bf0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
13c00 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
13c10 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ync ){.      /* 
13c20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
13c30 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65  mode, write a ne
13c40 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  w journal header
13c50 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
13c60 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
13c70 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
13c80 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69   avoid ever modi
13c90 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a  fying a journal.
13ca0 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20        ** header 
13cb0 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
13cc0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
13cd0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
13ce0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  ave.      ** alr
13cf0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
13d00 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
13d10 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
13d20 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a  eader is.      *
13d30 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74  * trashed when t
13d40 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
13d50 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20   updated)..     
13d60 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
13d70 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
13d80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13d90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30  ->journalOff > 0
13da0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
13db0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
13dc0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
13dd0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
13de0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13df0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13e00 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
13e10 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  irst;.  }.  if( 
13e20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pPg==0 ){.    re
13e30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13e40 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
13e50 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
13e60 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
13e70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
13e80 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
13e90 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
13ea0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
13eb0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
13ec0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13ed0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
13ee0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
13ef0 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
13f00 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
13f10 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28  ( pPg );.    if(
13f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13f30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
13f40 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
13f50 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
13f60 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
13f70 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
13f80 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
13f90 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
13fa0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a  llback, then.  *
13fb0 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
13fc0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
13fd0 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
13fe0 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71  ling the.  ** sq
13ff0 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  lite_dont_rollba
14000 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
14010 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
14020 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
14030 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  on..  ** It is n
14040 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
14050 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
14060 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
14070 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  ysRollback.  ** 
14080 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
14090 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
140a0 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
140b0 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
140c0 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ember.  ** that 
140d0 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c  is was marked al
140e0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54  waysRollback.  T
140f0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
14100 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20  ll pages must.  
14110 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
14120 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
14130 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
14140 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
14150 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
14160 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ){.    pPager->a
14170 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
14180 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  1;.  }..  /* Unl
14190 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
141a0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
141b0 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
141c0 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e   table.  */.  un
141d0 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
141e0 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
141f0 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70  r->nOvfl);..  *p
14200 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
14210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14220 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
14230 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
14240 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
14250 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
14260 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
14270 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
14280 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
14290 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
142a0 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
142b0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
142c0 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
142d0 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
142e0 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  Free()ed..**.** 
142f0 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
14300 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
14310 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
14320 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
14330 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
14340 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
14350 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67  n returns. A neg
14360 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20  ative value for 
14370 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72  nReq means.** fr
14380 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
14390 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54  y as possible. T
143a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
143b0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
143c0 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
143d0 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
143e0 73 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  sed..*/.#ifndef 
143f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
14400 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e  RY_MANAGEMENT.in
14410 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
14420 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e  elease_memory(in
14430 74 20 6e 52 65 71 29 7b 0a 20 20 54 68 72 65 61  t nReq){.  Threa
14440 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
14450 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
14460 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20  );.  Pager *p;. 
14470 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
14480 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
14490 2f 2a 20 49 66 20 74 68 65 20 64 69 73 61 62 6c  /* If the disabl
144a0 65 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 20 6d  eReleaseMemory m
144b0 65 6d 6f 72 79 20 66 6c 61 67 20 69 73 20 73 65  emory flag is se
144c0 74 2c 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  t, this operatio
144d0 6e 20 69 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f  n is.  ** a no-o
144e0 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
144f0 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
14500 64 2e 20 54 68 65 20 66 6c 61 67 20 69 73 20 73  d. The flag is s
14510 65 74 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d  et before.  ** m
14520 61 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  alloc() is calle
14530 64 20 77 68 69 6c 65 20 74 68 65 20 67 6c 6f 62  d while the glob
14540 61 6c 20 6d 75 74 65 78 20 28 73 65 65 20 73 71  al mutex (see sq
14550 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
14560 78 29 20 0a 20 20 2a 2a 20 69 73 20 68 65 6c 64  x) .  ** is held
14570 2e 20 42 65 63 61 75 73 65 20 73 6f 6d 65 20 6f  . Because some o
14580 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b  f the code invok
14590 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
145a0 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a  ion may also.  *
145b0 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * try to obtain 
145c0 74 68 65 20 6d 75 74 65 78 2c 20 70 72 6f 63 65  the mutex, proce
145d0 64 69 6e 67 20 6d 61 79 20 63 61 75 73 65 20 61  ding may cause a
145e0 20 64 65 61 64 6c 6f 63 6b 2e 20 0a 20 20 2a 2f   deadlock. .  */
145f0 0a 20 20 69 66 28 20 70 54 73 64 2d 3e 64 69 73  .  if( pTsd->dis
14600 61 62 6c 65 52 65 6c 65 61 73 65 4d 65 6d 6f 72  ableReleaseMemor
14610 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
14620 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
14630 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
14640 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
14650 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
14660 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
14670 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
14680 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
14690 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
146a0 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
146b0 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
146c0 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
146d0 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
146e0 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
146f0 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
14700 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
14710 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
14720 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
14730 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
14740 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
14750 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
14760 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
14770 3d 3d 30 20 7c 7c 20 69 3d 3d 31 3b 20 69 2b 2b  ==0 || i==1; i++
14780 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ){..    /* Loop 
14790 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
147a0 53 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70  SQLite pagers op
147b0 65 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72  ened by the curr
147c0 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20  ent thread. */. 
147d0 20 20 20 66 6f 72 28 70 3d 70 54 73 64 2d 3e 70     for(p=pTsd->p
147e0 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65  Pager; p && (nRe
147f0 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
14800 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65  <nReq); p=p->pNe
14810 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  xt){.      PgHdr
14820 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74   *pPg;.      int
14830 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46   rc;..      /* F
14840 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74  or each pager, t
14850 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61  ry to free as ma
14860 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73  ny pages as poss
14870 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20  ible (without . 
14880 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
14890 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20  fsync() if this 
148a0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65  is the first ite
148b0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75  ration of the ou
148c0 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a  termost .      *
148d0 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a  * loop)..      *
148e0 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  /.      while( S
148f0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
14900 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c  pager_recycle(p,
14910 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70 50   i, &pPg)) && pP
14920 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g) {.        /* 
14930 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61  We've found a pa
14940 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74  ge to free. At t
14950 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
14960 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20  ge has been .   
14970 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20       ** removed 
14980 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61  from the page ha
14990 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c  sh-table, free-l
149a0 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c  ist and synced-l
149b0 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ist .        ** 
149c0 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
149d0 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
149e0 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
149f0 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
14a00 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20     ** Remove it 
14a10 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62  from this list b
14a20 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20  efore freeing.. 
14a30 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
14a40 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b    ** Todo: Check
14a50 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74   the Pager.pStmt
14a60 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   list to make su
14a70 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49  re this is Ok. I
14a80 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  t .        ** pr
14a90 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68  obably is though
14aa0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14ab0 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70       PgHdr *pTmp
14ac0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14ad0 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
14ae0 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
14af0 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
14b00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
14b10 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  g==p->pAll ){.  
14b20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c           p->pAll
14b30 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
14b40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14b50 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20  .          for( 
14b60 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54  pTmp=p->pAll; pT
14b70 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
14b80 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
14b90 65 78 74 41 6c 6c 20 29 3b 0a 20 20 20 20 20 20  extAll );.      
14ba0 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41      pTmp->pNextA
14bb0 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
14bc0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
14bd0 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
14be0 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69  += sqliteAllocSi
14bf0 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ze(pPg);.       
14c00 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
14c10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14c20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14c30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
14c40 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   An error occure
14c50 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
14c60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14c70 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20   file or .      
14c80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20    ** journal in 
14c90 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e  pager_recycle().
14ca0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   The error is no
14cb0 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  t returned to th
14cc0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  e .        ** ca
14cd0 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e  ller of this fun
14ce0 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20  ction. Instead, 
14cf0 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72  set the Pager.er
14d00 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 2e 0a  rMask variable..
14d10 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65          ** The e
14d20 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
14d30 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
14d40 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20  r (or users, in 
14d50 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20  the case .      
14d60 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64    ** of a shared
14d70 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66   pager cache) of
14d80 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77   the pager for w
14d90 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f  hich the error o
14da0 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20  ccured..        
14db0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
14dc0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  t( rc==SQLITE_IO
14dd0 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ERR || rc==SQLIT
14de0 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  E_FULL );.      
14df0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61    assert( p->sta
14e00 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
14e10 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61  ED );.        pa
14e20 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29  ger_error(p, rc)
14e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14e40 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52    }..  return nR
14e50 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69  eleased;.}.#endi
14e60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14e70 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
14e80 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  NT */../*.** Acq
14e90 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
14ea0 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
14eb0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
14ec0 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
14ed0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
14ee0 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
14ef0 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
14f00 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
14f10 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
14f20 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
14f30 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f   A _get works fo
14f40 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
14f50 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
14f60 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
14f70 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
14f80 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
14f90 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
14fa0 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
14fb0 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
14fc0 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
14fd0 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
14fe0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
14ff0 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
15000 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
15010 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
15020 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
15030 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
15040 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
15050 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
15060 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
15070 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
15080 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
15090 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
150a0 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
150b0 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
150c0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
150d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
150e0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
150f0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
15100 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
15110 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
15120 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
15130 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f  routine and _loo
15140 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
15150 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
15160 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
15170 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
15180 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
15190 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
151a0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
151b0 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
151c0 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
151d0 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28  whereas _lookup(
151e0 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
151f0 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
15200 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
15210 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
15220 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
15230 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
15240 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
15250 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
15260 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
15270 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c  ary..** Since _l
15280 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
15290 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
152a0 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
152b0 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
152c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
152d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
152e0 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a  ager_get(Pager *
152f0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
15300 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
15310 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
15320 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
15330 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
15340 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
15350 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
15360 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
15370 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72  e.  ** number gr
15380 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
15390 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71   or zero, is req
153a0 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  uested..  */.  i
153b0 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
153c0 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
153d0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
153e0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
153f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15400 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
15410 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  PT;.  }..  /* Ma
15420 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
15430 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74  not hit any crit
15440 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a  ical errors..  *
15450 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  / .  assert( pPa
15460 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50  ger!=0 );.  *ppP
15470 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  age = 0;.  if( p
15480 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
15490 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
154a0 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
154b0 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
154c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
154d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
154e0 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65   first page acce
154f0 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61  ssed, then get a
15500 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a   SHARED lock.  *
15510 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
15520 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
15530 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
15540 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a  =0 && !MEMDB ){.
15550 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
15560 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  >noReadlock ){. 
15570 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15580 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
15590 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
155a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
155b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
155c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
155d0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
155e0 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
155f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
15600 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
15610 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
15620 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
15630 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
15640 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
15650 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
15660 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
15670 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
15680 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
15690 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  f( hasHotJournal
156a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
156b0 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
156c0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
156d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
156e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
156f0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
15700 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a 20  it is.       ** 
15710 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
15720 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
15730 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
15740 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
15750 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  .       ** EXCLU
15760 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
15770 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
15780 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
15790 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  n the.       ** 
157a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
157b0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
157c0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
157d0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
157e0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
157f0 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
15800 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
15810 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
15820 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20  lling it .      
15830 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
15840 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20 42   ** .       ** B
15850 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
15860 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
15870 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
15880 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20  uested, the.    
15890 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
158a0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
158b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
158c0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
158d0 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62   to.       ** ob
158e0 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58  tain it's own EX
158f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
15900 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15910 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
15920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15930 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
15940 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
15950 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  K);.       if( r
15960 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15970 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15980 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
15990 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
159a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
159b0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
159c0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72  LOCK;.         r
159d0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
159e0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
159f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
15a00 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
15a10 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
15a20 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .       /* Open 
15a30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
15a40 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52  reading only.  R
15a50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
15a60 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77  Y if.       ** w
15a70 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
15a80 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
15a90 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a   file. .       *
15aa0 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  *.       ** The 
15ab0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
15ac0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
15ad0 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20   locked itself. 
15ae0 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a   The.       ** j
15af0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
15b00 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73  ever open unless
15b10 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15b20 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20  se file holds.  
15b30 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
15b40 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
15b50 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
15b60 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
15b70 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  e.       ** proc
15b80 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
15b90 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
15ba0 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
15bb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
15bc0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
15bd0 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e  eadOnly(pPager->
15be0 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
15bf0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
15c00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15c10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71  K ){.         sq
15c20 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
15c30 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
15c40 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  K);.         pPa
15c50 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
15c60 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
15c70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15c80 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d  E_BUSY;.       }
15c90 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
15ca0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
15cb0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
15cc0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
15cd0 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
15ce0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
15cf0 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
15d00 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
15d10 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
15d20 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
15d30 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62  .       /* Playb
15d40 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
15d50 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
15d60 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
15d70 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c  rite.       ** l
15d80 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
15d90 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
15da0 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
15db0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
15dc0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
15dd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15df0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
15e00 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
15e10 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  c);.       }.   
15e20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a   }.    pPg = 0;.
15e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
15e40 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20  Search for page 
15e50 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20  in cache */.    
15e60 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
15e70 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
15e80 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
15e90 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
15ea0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
15eb0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
15ec0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
15ed0 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ARED;.    }.  }.
15ee0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
15ef0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
15f00 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
15f10 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
15f20 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68  he. */.    int h
15f30 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28  ;.    TEST_INCR(
15f40 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
15f50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15f60 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
15f70 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Page || pPager->
15f80 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d  pFirst==0 || MEM
15f90 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  DB ){.      /* C
15fa0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
15fb0 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
15fc0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
15fd0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
15fe0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
16010 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
16020 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
16050 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
16060 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
16070 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
16080 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16090 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
160a0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
160b0 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
160c0 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg));.      if( 
160d0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
160e0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
160f0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
16100 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67  r), 0, sizeof(Pg
16110 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20  History));.     
16120 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
16130 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
16140 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41       pPg->pNextA
16150 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
16160 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  l;.      pPager-
16170 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
16180 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
16190 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ++;.      if( pP
161a0 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67  ager->nPage>pPag
161b0 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a  er->nMaxPage ){.
161c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
161d0 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
161e0 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  ==(pPager->nPage
161f0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  -1) );.        p
16200 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b  Pager->nMaxPage+
16210 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
16220 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
16230 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
16240 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b  Pager, 1, &pPg);
16250 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16270 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
16280 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
16290 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
162a0 20 20 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a    assert(pPg) ;.
162b0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
162c0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
162d0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
162e0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
162f0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
16300 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
16310 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d   sqlite3CheckMem
16320 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ory(pPager->aInJ
16330 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b  ournal, pgno/8);
16340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16350 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16360 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
16370 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
16380 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16390 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
163a0 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
163b0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
163c0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
163d0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
163e0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
163f0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
16400 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
16410 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
16420 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  mt && (int)pgno<
16430 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
16440 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  e.             &
16450 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  & (pPager->aInSt
16460 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  mt[pgno/8] & (1<
16470 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29  <(pgno&7)))!=0 )
16480 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  {.      page_add
16490 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
164a0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
164b0 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
164c0 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
164d0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
164e0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
164f0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
16500 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
16510 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  Pg);.    pPager-
16520 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d  >nRef++;.    h =
16530 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f   pager_hash(pgno
16540 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
16550 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
16560 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
16570 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
16580 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
16590 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
165a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
165b0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
165c0 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
165d0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
165e0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
165f0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
16600 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
16610 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
16620 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
16630 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
16640 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
16650 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
16660 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
16670 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  sk!=0 ){.      s
16680 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
16690 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
166a0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20  pPg));.      rc 
166b0 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
166c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
166d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
166e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 70      if( sqlite3p
166f0 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
16700 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f  Pager)<(int)pgno
16710 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
16720 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
16730 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
16740 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
16750 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
16760 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
16770 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
16780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16790 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
167a0 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
167b0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
167c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
167d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
167e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
167f0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
16800 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
16810 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20  ATA(pPg),.      
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16840 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16850 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28   }.      TRACE3(
16860 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
16870 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
16880 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
16890 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
168a0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
168b0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
168c0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
168d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
168e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  K ){.        i64
168f0 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20   fileSize;.     
16900 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
16910 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
16920 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d  >fd,&fileSize)!=
16930 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
16940 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65           || file
16950 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65  Size>=pgno*pPage
16960 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
16970 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16980 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
16990 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
169a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
169b0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
169c0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
169d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
169e0 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61      clear_simula
169f0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a  ted_io_error();.
16a00 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
16a10 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
16a20 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
16a30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16a40 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16a50 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49  {.        TEST_I
16a60 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
16a70 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
16a80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
16a90 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
16aa0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
16ab0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
16ac0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
16ad0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
16ae0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
16af0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
16b00 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54  che. */.    TEST
16b10 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
16b20 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  it);.    page_re
16b30 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
16b40 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
16b50 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
16b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16b70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
16b80 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
16b90 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
16ba0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
16bb0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
16bc0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
16bd0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
16be0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
16bf0 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
16c00 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
16c10 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
16c20 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
16c30 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
16c40 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16c50 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
16c60 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70  .** and sqlite3p
16c70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
16c80 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
16c90 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
16ca0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
16cb0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
16cc0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
16cd0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
16ce0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
16cf0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
16d00 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
16d10 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
16d20 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
16d30 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
16d40 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
16d50 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
16d60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16d70 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
16d80 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
16d90 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
16da0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
16db0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
16dc0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
16dd0 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
16de0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
16df0 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
16e00 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
16e10 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
16e20 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
16e30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
16e40 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
16e50 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
16e60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
16e70 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
16e80 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
16e90 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
16ea0 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
16eb0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
16ec0 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
16ed0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
16ee0 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
16ef0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
16f00 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
16f10 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
16f20 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
16f30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16f40 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
16f50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
16f60 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
16f70 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
16f80 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
16f90 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
16fa0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
16fb0 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
16fc0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
16fd0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
16fe0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
16ff0 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
17000 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
17010 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  g);..  CHECK_PAG
17020 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  E(pPg);..  /* Wh
17030 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
17040 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
17050 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
17060 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
17070 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
17080 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
17090 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
170a0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
170b0 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
170c0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67  pPager;.    pPag
170d0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
170e0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
170f0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Free = 0;.    pP
17100 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  g->pPrevFree = p
17110 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20  Pager->pLast;.  
17120 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
17130 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
17140 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
17150 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
17160 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
17170 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73   = pPg;.    }els
17180 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
17190 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
171a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
171b0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26  ->needSync==0 &&
171c0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
171d0 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ynced==0 ){.    
171e0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
171f0 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
17200 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
17210 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
17220 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17230 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61  >xDestructor(pDa
17240 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
17250 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
17260 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
17270 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
17280 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
17290 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
172a0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
172b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
172c0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
172d0 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
172e0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
172f0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
17300 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
17310 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
17320 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
17330 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
17340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17350 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
17360 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
17370 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
17380 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
17390 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
173a0 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
173b0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
173c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
173d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
173e0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
173f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17400 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
17410 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
17420 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
17430 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
17440 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
17450 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
17460 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
17470 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
17480 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17490 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
174a0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
174b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
174c0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
174d0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
174e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
174f0 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
17500 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
17510 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
17520 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
17530 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73  ournal==0 );.  s
17540 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
17550 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
17560 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17570 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
17580 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
17590 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
175a0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
175b0 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
175c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
175d0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
175e0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
175f0 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  l;.  }.  rc = sq
17600 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
17610 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  sive(pPager->zJo
17620 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
17630 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  jfd,.           
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65        pPager->te
17660 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65  mpFile);.  pPage
17670 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
17680 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
17690 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
176a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
176b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
176c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
176d0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
176e0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
176f0 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  }.  sqlite3OsSet
17700 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
17710 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
17720 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
17730 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
17740 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
17750 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  er->fullSync);. 
17760 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
17770 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
17780 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69  jfd, pPager->zDi
17790 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67  rectory);.  pPag
177a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
177b0 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
177c0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
177d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
177e0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
177f0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
17800 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
17810 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
17820 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
17830 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
17840 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
17850 70 50 61 67 65 72 29 3b 0a 20 20 20 20 67 6f 74  pPager);.    got
17860 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
17870 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
17880 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
17890 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
178a0 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
178b0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
178c0 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
178d0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
178e0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
178f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
17900 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
17910 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  _begin(pPager);.
17920 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
17930 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
17940 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
17950 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
17960 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
17970 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
17980 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
179a0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
179b0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c  return rc;..fail
179c0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
179d0 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  al:.  sqliteFree
179e0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
179f0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
17a00 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
17a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17a20 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a  _NOMEM ){.    /*
17a30 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 6d   If this was a m
17a40 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
17a50 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f   then we will no
17a60 74 20 62 65 20 63 6c 6f 73 69 6e 67 20 74 68 65  t be closing the
17a70 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 69   pager.    ** fi
17a80 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65 20 61 6e  le. So delete an
17a90 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  y journal file w
17aa0 65 20 6d 61 79 20 68 61 76 65 20 6a 75 73 74 20  e may have just 
17ab0 63 72 65 61 74 65 64 2e 20 4f 74 68 65 72 77 69  created. Otherwi
17ac0 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  se,.    ** the s
17ad0 79 73 74 65 6d 20 77 69 6c 6c 20 67 65 74 20 63  ystem will get c
17ae0 6f 6e 66 75 73 65 64 2c 20 77 65 20 68 61 76 65  onfused, we have
17af0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
17b00 74 68 65 20 66 69 6c 65 20 61 6e 64 20 61 0a 20  the file and a. 
17b10 20 20 20 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73     ** mysterious
17b20 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 70 70   journal has app
17b30 65 61 72 65 64 20 69 6e 20 74 68 65 20 66 69 6c  eared in the fil
17b40 65 73 79 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a  esystem..    */.
17b50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
17b60 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
17b70 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rnal);.  }else{.
17b80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
17b90 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
17ba0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  NO_LOCK);.    pP
17bb0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
17bc0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  GER_UNLOCK;.  }.
17bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17be0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
17bf0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
17c00 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
17c10 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
17c20 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
17c30 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17c40 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
17c50 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
17c60 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61  r_commit() is ca
17c70 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
17c80 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
17c90 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
17ca0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
17cb0 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73  pager_close() is
17cc0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
17cd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
17ce0 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ref() is called 
17cf0 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73  to on every outs
17d00 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a  tanding page..**
17d10 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
17d20 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
17d30 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
17d40 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
17d50 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
17d60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
17d70 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
17d80 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
17d90 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
17da0 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65  ly to.** acquire
17db0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17dc0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
17dd0 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
17de0 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  hat there is.** 
17df0 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
17e00 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17e10 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ase..**.** The s
17e20 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
17e30 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75  indicates how mu
17e40 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  ch space in byte
17e50 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  s to reserve for
17e60 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75   a.** master jou
17e70 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61  rnal file-name a
17e80 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
17e90 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20  he journal when 
17ea0 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a  it is created..*
17eb0 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66  *.** A journal f
17ec0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ile is opened if
17ed0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
17ee0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
17ef0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  For temporary.**
17f00 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e   files, the open
17f10 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
17f20 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
17f30 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
17f40 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20  is an.** actual 
17f50 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  need to write to
17f60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
17f70 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
17f80 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72  ase is already r
17f90 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74  eserved for writ
17fa0 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ing, this routin
17fb0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
17fc0 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73  .** If exFlag is
17fd0 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20   true, go ahead 
17fe0 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55  and get an EXCLU
17ff0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
18000 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61   file.** immedia
18010 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20  tely instead of 
18020 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65  waiting until we
18030 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68   try to flush th
18040 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a  e cache.  The.**
18050 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72   exFlag is ignor
18060 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ed if a transact
18070 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
18080 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
18090 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
180a0 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e  (void *pData, in
180b0 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 67 48  t exFlag){.  PgH
180c0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
180d0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
180e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
180f0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
18100 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18110 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
18120 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
18130 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18140 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
18150 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
18160 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
18170 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20  R_SHARED ){.    
18180 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18190 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  aInJournal==0 );
181a0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
181b0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
181c0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
181d0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70  CLUSIVE;.      p
181e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
181f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
18200 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ze;.    }else{. 
18210 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18220 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
18230 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
18240 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
18250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18260 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
18270 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
18280 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69  ERVED;.        i
18290 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
182a0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
182b0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
182c0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
182d0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
182e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
182f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18300 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
18310 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18320 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69        pPager->di
18330 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
18340 20 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e      TRACE2("TRAN
18350 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
18360 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
18370 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
18380 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
18390 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
183a0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
183b0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
183c0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
183d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
183e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
183f0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
18400 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
18410 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
18420 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
18430 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
18440 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
18450 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
18460 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
18470 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
18480 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
18490 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
184a0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
184b0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
184c0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
184d0 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
184e0 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
184f0 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
18500 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
18510 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
18520 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
18530 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
18540 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
18550 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
18560 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
18570 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
18580 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
18590 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
185a0 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
185b0 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
185c0 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
185d0 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
185e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
185f0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
18600 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
18610 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
18620 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
18630 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
18640 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
18650 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
18660 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
18670 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
18680 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
18690 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
186a0 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
186b0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
186c0 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
186d0 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
186e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
186f0 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
18700 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
18710 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
18720 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
18730 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70  er_write(void *p
18740 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
18750 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
18760 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
18770 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
18780 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
18790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
187a0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
187b0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
187c0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
187d0 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  sk ){ .    retur
187e0 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  n pager_errcode(
187f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
18800 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
18810 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
18820 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
18830 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
18840 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
18850 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
18860 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61  E(pPg);..  /* Ma
18870 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
18880 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
18890 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
188a0 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
188b0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
188c0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
188d0 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
188e0 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79   */.  pPg->dirty
188f0 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
18900 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
18910 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50  Pg->inStmt || pP
18920 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
18930 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
18940 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
18950 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
18960 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
18970 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
18980 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
18990 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
189a0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
189b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
189c0 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
189d0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
189e0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
189f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
18a00 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
18a10 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
18a20 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
18a30 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
18a40 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
18a50 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
18a60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18a70 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
18a80 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
18a90 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
18aa0 5f 62 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29  _begin(pData, 0)
18ab0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18ac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18ad0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18ae0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
18af0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
18b00 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
18b10 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
18b20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
18b30 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
18b40 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
18b50 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
18b60 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
18b70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18b80 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18b90 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18ba0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
18bb0 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
18bc0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
18bd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
18be0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a  tyCache = 1;.  .
18bf0 20 20 20 20 2f 2a 20 54 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 6e  action journal n
18c10 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
18c20 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
18c30 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
18c40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
18c50 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
18c60 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
18c70 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
18c80 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
18c90 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
18ca0 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
18cb0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
18cc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
18cd0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
18ce0 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  (pPager->useJour
18cf0 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b  nal || MEMDB) ){
18d00 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29  .      if( (int)
18d10 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
18d20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
18d30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
18d40 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32  zPg;.        u32
18d50 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20   saved;.        
18d60 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
18d70 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
18d80 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
18d90 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
18da0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
18db0 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
18dc0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
18dd0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
18de0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
18df0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
18e00 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
18e10 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
18e20 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
18e30 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
18e40 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
18e50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69           if( pHi
18e60 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
18e70 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
18e80 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
18e90 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
18ea0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18eb0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ze);.          }
18ec0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18ed0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
18ee0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  sum;.          /
18ef0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
18f00 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
18f10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
18f20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
18f30 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
18f40 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
18f50 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
18f60 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
18f70 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
18f80 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
18f90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
18fa0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
18fb0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
18fc0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
18fd0 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
18fe0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
18ff0 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 7);.         
19000 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
19010 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67  ksum(pPager, pPg
19020 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a  ->pgno, pData);.
19030 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20            saved 
19040 3d 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54  = *(u32*)PGHDR_T
19050 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
19060 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
19070 73 74 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75  store32bits(cksu
19080 6d 2c 20 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  m, pPg, pPager->
19090 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
190a0 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67       szPg = pPag
190b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a  er->pageSize+8;.
190c0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 33            store3
190d0 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c  2bits(pPg->pgno,
190e0 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20   pPg, -4);.     
190f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19100 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19110 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  >jfd, &((char*)p
19120 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29  Data)[-4], szPg)
19130 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
19140 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
19150 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  = szPg;.        
19160 20 20 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41    TRACE4("JOURNA
19170 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
19180 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
191a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
191b0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
191c0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
191d0 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
191e0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
191f0 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  gno, 0);.       
19200 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f     *(u32*)PGHDR_
19210 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
19220 61 67 65 72 29 20 3d 20 73 61 76 65 64 3b 0a 20  ager) = saved;. 
19230 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
19240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
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 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
19290 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
192a0 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  R_FULL;.        
192b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
192c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
192d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
192e0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
192f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
19300 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
19310 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
19320 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
19330 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
19340 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
19350 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
19360 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
19370 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
19380 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19390 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
193a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
193b0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
193c0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
193d0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
193e0 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
193f0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
19400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
19430 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
19440 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
19450 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
19460 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
19470 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e 44    TRACE4("APPEND
19480 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
19490 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
194a0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
194b0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
194c0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
194d0 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  dSync);.      }.
194e0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
194f0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
19500 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
19510 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
19520 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
19530 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
19540 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
19550 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
19560 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
19570 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
19580 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
19590 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
195a0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
195b0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
195c0 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
195d0 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
195e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
195f0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
19600 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
19610 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
19620 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
19630 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
19640 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
19650 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19660 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
19670 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
19680 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
19690 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
196a0 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  mtSize ){.      
196b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
196c0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
196d0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
196e0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
196f0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
19700 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
19710 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
19720 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
19730 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
19740 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
19750 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
19760 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
19770 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
19780 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
19790 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
197a0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
197b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
197c0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
197d0 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
197e0 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
197f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
19800 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43    }.        TRAC
19810 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
19820 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
19830 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
19840 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
19850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19860 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
19870 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
19880 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
19890 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
198a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
198b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
198c0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
198d0 72 2d 3e 73 74 66 64 2c 28 28 63 68 61 72 2a 29  r->stfd,((char*)
198e0 70 44 61 74 61 29 2d 34 2c 0a 20 20 20 20 20 20  pData)-4,.      
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19900 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
19910 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20  >pageSize+4);.  
19920 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
19930 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
19940 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
19950 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19960 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43  pgno);.        C
19970 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
19980 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30  ta, pPg->pgno, 0
19990 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
199a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
199b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
199c0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
199d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
199e0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
199f0 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
19a00 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  FULL;.          
19a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19a20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
19a30 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b  ger->stmtNRec++;
19a40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19a50 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
19a60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
19a70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
19a80 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
19a90 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
19aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19ab0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
19ac0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
19ad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
19ae0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
19af0 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
19b00 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
19b10 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
19b20 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
19b30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
19b40 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
19b50 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
19b60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
19b70 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
19b80 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
19b90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
19ba0 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
19bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19bc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
19bd0 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
19be0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
19bf0 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
19c00 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
19c10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
19c20 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
19c30 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
19c40 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
19c50 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
19c60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
19c70 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  page..*/.int sql
19c80 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
19c90 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
19ca0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
19cb0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
19cc0 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
19cd0 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
19ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19cf0 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
19d00 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
19d10 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
19d20 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
19d30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
19d40 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
19d50 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
19d60 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72  ite3pager_overwr
19d70 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
19d80 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
19d90 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f  id *pData){.  vo
19da0 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  id *pPage;.  int
19db0 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
19dc0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
19dd0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61  ager, pgno, &pPa
19de0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
19df0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19e00 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
19e10 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
19e20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19e30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
19e40 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61  emcpy(pPage, pDa
19e50 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
19e60 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
19e70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
19e80 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ref(pPage);.  }.
19e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
19ea0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
19eb0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
19ec0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
19ed0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
19ee0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
19ef0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
19f00 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
19f10 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20   "pgno" back to 
19f20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
19f30 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
19f40 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
19f50 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a  ed as dirty..**.
19f60 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
19f70 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
19f80 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
19f90 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
19fa0 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
19fb0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
19fc0 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67  unused.  The pag
19fd0 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
19fe0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
19ff0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
1a000 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
1a010 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
1a020 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
1a030 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  s optimization, 
1a040 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
1a050 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65  e.** sqlite3page
1a060 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
1a070 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
1a080 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
1a090 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
1a0a0 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
1a0b0 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
1a0c0 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
1a0d0 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
1a0e0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
1a0f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
1a100 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
1a110 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
1a120 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
1a130 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
1a140 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
1a150 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20  lback() for the 
1a160 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c  same page.** wil
1a170 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20  l thereafter be 
1a180 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
1a190 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
1a1a0 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a  void a problem.*
1a1b0 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77  * where a page w
1a1c0 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65  ith data is adde
1a1d0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1a1e0 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72  t during one par
1a1f0 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61  t of.** a transa
1a200 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76  ction then remov
1a210 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
1a220 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61  list during a la
1a230 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  ter part.** of t
1a240 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
1a250 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66  ion and reused f
1a260 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1a270 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a  rpose.  When it.
1a280 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65  ** is first adde
1a290 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1a2a0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1a2b0 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e  is called.  When
1a2c0 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20   reused,.** the 
1a2d0 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1a2e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1a2f0 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
1a300 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
1a310 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61  s.** critical da
1a320 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
1a330 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
1a340 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  gets rolled back
1a350 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20   in spite.** of 
1a360 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  the dont_rollbac
1a370 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69  k() call..*/.voi
1a380 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  d sqlite3pager_d
1a390 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20  ont_write(Pager 
1a3a0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
1a3b0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
1a3c0 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  g;..  if( MEMDB 
1a3d0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67  ) return;..  pPg
1a3e0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
1a3f0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1a400 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1a410 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20  back = 1;.  if( 
1a420 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74  pPg && pPg->dirt
1a430 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74  y && !pPager->st
1a440 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 69  mtInUse ){.    i
1a450 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1a460 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1a470 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1a480 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1a490 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1a4a0 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1a4b0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1a4c0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1a4d0 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1a4e0 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1a4f0 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1a500 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1a510 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1a520 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1a530 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1a540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a550 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1a560 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1a570 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1a580 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1a590 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1a5a0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1a5b0 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1a5c0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1a5d0 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1a5e0 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1a5f0 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1a600 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1a610 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1a620 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1a630 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1a640 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1a650 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1a660 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1a670 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1a680 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1a690 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1a6a0 20 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e       TRACE3("DON
1a6b0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1a6c0 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20  of %d\n", pgno, 
1a6d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1a6e0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
1a6f0 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
1a700 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1a710 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
1a720 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1a730 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
1a740 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
1a750 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1a760 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1a770 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1a780 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
1a790 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
1a7a0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1a7b0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
1a7c0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
1a7d0 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
1a7e0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1a7f0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
1a800 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
1a810 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
1a820 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
1a830 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
1a840 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1a850 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
1a860 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
1a870 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
1a880 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
1a890 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1a8a0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
1a8b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1a8c0 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e!=PAGER_EXCLUSI
1a8d0 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  VE || pPager->jo
1a8e0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
1a8f0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
1a900 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1a910 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
1a920 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45  ysRollback || ME
1a930 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
1a940 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
1a950 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
1a960 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1a970 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1a980 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a990 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1a9a0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1a9b0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
1a9c0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1a9d0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1a9e0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1a9f0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
1aa00 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1aa10 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1aa20 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
1aa30 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1aa40 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1aa50 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1aa60 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
1aa70 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f  }.    TRACE3("DO
1aa80 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
1aa90 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
1aaa0 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
1aab0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20  (pPager));.  }. 
1aac0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1aad0 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
1aae0 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  inStmt && (int)p
1aaf0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1ab00 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20  ->stmtSize ){.  
1ab10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1ab20 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
1ab30 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
1ab40 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1ab50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ab60 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
1ab70 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1ab80 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1ab90 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1aba0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67  pgno&7);.    pag
1abb0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1abc0 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  st(pPg);.  }.}..
1abd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1abe0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
1abf0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
1ac00 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
1ac10 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
1ac20 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
1ac30 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
1ac40 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
1ac50 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
1ac60 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1ac70 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
1ac80 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
1ac90 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
1aca0 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
1acb0 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
1acc0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  f../*.** Commit 
1acd0 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
1ace0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1acf0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1ad00 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
1ad10 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
1ad20 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
1ad30 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
1ad40 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
1ad50 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1ad60 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
1ad70 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
1ad80 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
1ad90 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
1ada0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1adb0 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  ger_commit(Pager
1adc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1add0 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
1ade0 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
1adf0 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52  ->errMask==PAGER
1ae00 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
1ae10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1ae20 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
1ae30 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1ae40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ae50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ae60 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  FULL;.    }.    
1ae70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1ae80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1ae90 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
1aea0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
1aeb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
1aec0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1aed0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1aee0 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
1aef0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1af00 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1af10 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  .  TRACE2("COMMI
1af20 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
1af30 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1af40 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
1af50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
1af60 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
1af70 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
1af80 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63  ( pPg ){.      c
1af90 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
1afa0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1afb0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
1afc0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1afd0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1afe0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1aff0 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
1b000 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
1b010 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
1b020 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
1b030 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
1b040 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ty;.    }.#ifnde
1b050 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
1b060 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
1b070 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
1b080 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1b090 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1b0a0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1b0b0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1b0c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1b0d0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1b0e0 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
1b0f0 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
1b100 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
1b110 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
1b120 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
1b130 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
1b140 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
1b150 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1b160 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
1b170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b180 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1b190 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
1b1a0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20   ){.    /* Exit 
1b1b0 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64  early (without d
1b1c0 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f  oing the time-co
1b1d0 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f  nsuming sqlite3O
1b1e0 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20  sSync() calls). 
1b1f0 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68     ** if there h
1b200 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  ave been no chan
1b210 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1b220 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
1b230 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b240 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
1b250 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
1b260 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
1b270 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1b280 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
1b290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1b2a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b2b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1b2c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1b2d0 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72  ager_sync(pPager
1b2e0 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
1b2f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b300 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
1b310 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20  abort;.  }.  rc 
1b320 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1b330 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
1b340 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b350 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
1b360 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1b370 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1b380 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
1b390 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
1b3a0 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
1b3b0 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70  bort:.  sqlite3p
1b3c0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
1b3d0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1b3e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
1b3f0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
1b400 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
1b410 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
1b420 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
1b430 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
1b440 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
1b450 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
1b460 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
1b470 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
1b480 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
1b490 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b4a0 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
1b4b0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1b4c0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
1b4d0 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
1b4e0 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
1b4f0 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
1b500 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
1b510 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1b520 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
1b530 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
1b540 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1b550 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
1b560 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
1b570 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
1b580 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
1b590 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
1b5a0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
1b5b0 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
1b5c0 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
1b5d0 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
1b5e0 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
1b5f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b600 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b610 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
1b620 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b630 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
1b640 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
1b650 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b660 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1b670 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
1b680 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
1b690 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
1b6a0 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
1b6b0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1b6c0 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
1b6d0 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
1b6e0 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1b6f0 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
1b700 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b710 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1b720 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1b730 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
1b740 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1b750 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1b760 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1b770 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
1b780 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
1b790 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1b7a0 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
1b7b0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1b7c0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1b7d0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
1b7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1b7f0 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
1b800 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
1b810 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
1b820 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
1b830 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE3("ROLLBACK-P
1b840 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  AGE %d of %d\n",
1b850 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1b860 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1b870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b880 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64   TRACE3("PAGE %d
1b890 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
1b8a0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1b8b0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
1b8d0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
1b8e0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
1b8f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
1b900 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1b910 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
1b920 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
1b930 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
1b940 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
1b950 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
1b960 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
1b970 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1b980 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
1b990 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  A(p), pPager->pa
1b9a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
1b9b0 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  .      .    }.  
1b9c0 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1b9d0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1b9e0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1b9f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
1ba00 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1ba10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1ba20 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1ba30 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1ba40 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1ba50 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1ba60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ba70 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1ba80 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
1ba90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1baa0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1bab0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1bac0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
1bad0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1bae0 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
1baf0 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
1bb00 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
1bb10 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   && pPager->errM
1bb20 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask!=PAGER_ERR_F
1bb30 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
1bb40 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1bb50 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
1bb60 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
1bb70 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
1bb80 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1bb90 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
1bba0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1bbb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1bbc0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1bbd0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
1bbe0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
1bbf0 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
1bc00 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61  r);.    rc2 = pa
1bc10 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1bc20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1bc30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bc40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1bc50 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1bc60 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1bc70 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
1bc80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1bc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1bcb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
1bcc0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
1bcd0 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
1bce0 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  UPT;.  }.  pPage
1bcf0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
1bd00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bd10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1bd20 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
1bd30 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
1bd40 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
1bd50 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
1bd60 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1bd70 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
1bd80 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
1bd90 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
1bda0 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
1bdb0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1bdc0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
1bdd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1bde0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
1bdf0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
1be00 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
1be10 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65  int *sqlite3page
1be20 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
1be30 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
1be40 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
1be50 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
1be60 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
1be70 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
1be80 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
1be90 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
1bea0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
1beb0 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
1bec0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
1bed0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 23  ager->errMask;.#
1bee0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1bef0 54 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  T.  a[6] = pPage
1bf00 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
1bf10 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
1bf20 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
1bf30 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20  ->nOvfl;.  a[9] 
1bf40 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
1bf50 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
1bf60 72 2d 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69  r->nWrite;.#endi
1bf70 66 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  f.  return a;.}.
1bf80 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
1bf90 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
1bfa0 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
1bfb0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
1bfc0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
1bfd0 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
1bfe0 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
1bff0 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
1c000 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
1c010 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
1c020 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
1c030 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
1c040 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
1c050 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
1c060 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
1c070 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
1c080 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1c090 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72  stmt_begin(Pager
1c0a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1c0b0 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d   rc;.  char zTem
1c0c0 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
1c0d0 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72  E_SIZE];.  asser
1c0e0 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
1c0f0 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
1c100 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
1c110 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32  e>=0 );.  TRACE2
1c120 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
1c130 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c140 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1c150 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
1c160 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1c170 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c180 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1c190 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
1c1a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c1b0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1c1c0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1c1d0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
1c1e0 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
1c1f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c200 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1c210 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c220 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
1c230 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
1c240 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1c250 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1c260 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1c270 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
1c280 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
1c290 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
1c2a0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
1c2b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c2c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
1c2d0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
1c2e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1c2f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1c300 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
1c310 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
1c320 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1c330 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
1c340 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
1c350 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
1c360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
1c370 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
1c380 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
1c390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
1c3a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1c3b0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1c3c0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
1c3d0 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
1c3e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
1c3f0 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
1c400 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
1c410 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1c420 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1c430 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
1c440 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
1c450 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28  ->stfd);.    if(
1c460 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1c470 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1c480 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
1c490 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
1c4a0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
1c4b0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1c4c0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
1c4d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c4e0 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
1c4f0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
1c500 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
1c510 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1c520 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
1c530 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1c540 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
1c550 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c560 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
1c570 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
1c580 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1c590 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
1c5a0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
1c5b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1c5c0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1c5d0 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
1c5e0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
1c5f0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
1c600 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1c610 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
1c620 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
1c630 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
1c640 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
1c650 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
1c660 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
1c670 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
1c680 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
1c690 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
1c6a0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1c6b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
1c6c0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1c6d0 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
1c6e0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
1c6f0 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
1c700 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
1c710 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
1c720 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
1c730 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1c740 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
1c750 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
1c760 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   0;.      if( ME
1c770 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
1c780 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1c790 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1c7a0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1c7b0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1c7c0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
1c7d0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1c7e0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c7f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
1c800 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
1c810 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1c820 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
1c830 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
1c840 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
1c850 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
1c860 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1c870 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c880 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
1c890 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1c8a0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1c8b0 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
1c8c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1c8d0 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
1c8e0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1c8f0 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52    TRACE2("STMT-R
1c900 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
1c910 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1c920 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
1c930 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
1c940 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  Pg;.      for(pP
1c950 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
1c960 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1c970 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
1c980 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1c990 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1c9a0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1c9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
1c9c0 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
1c9d0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
1c9e0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1c9f0 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
1ca00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ca10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1ca20 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
1ca30 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
1ca40 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1ca50 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1ca60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1ca70 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1ca80 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
1ca90 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63       memoryTrunc
1caa0 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
1cab0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cac0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1cad0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
1cae0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
1caf0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
1cb00 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1cb10 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
1cb20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1cb30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cb40 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1cb50 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
1cb60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cb70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cb80 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
1cb90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cba0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1cbb0 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1cbc0 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  filename(Pager *
1cbd0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1cbe0 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
1cbf0 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
1cc00 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
1cc10 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
1cc20 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
1cc30 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
1cc40 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67  ager_dirname(Pag
1cc50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1cc60 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
1cc70 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
1cc80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1cc90 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1cca0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1ccb0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1ccc0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75  sqlite3pager_jou
1ccd0 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
1cce0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1ccf0 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
1cd00 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
1cd10 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
1cd20 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
1cd30 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
1cd40 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
1cd50 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
1cd60 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
1cd70 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
1cd80 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6e  t sqlite3pager_n
1cd90 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
1cda0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1cdb0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
1cdc0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1cdd0 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
1cde0 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
1cdf0 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f  ite3pager_set_co
1ce00 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
1ce10 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78  ager,.  void (*x
1ce20 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
1ce30 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
1ce40 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
1ce50 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
1ce60 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
1ce70 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
1ce80 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
1ce90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1cea0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1ceb0 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1cec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1ced0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1cee0 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1cef0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1cf00 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1cf10 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1cf20 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1cf30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76  er *pPager){.  v
1cf40 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67  oid *pPage;.  Pg
1cf50 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
1cf60 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1cf70 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1cf80 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1cf90 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1cfa0 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  riting. */.  rc 
1cfb0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1cfc0 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
1cfd0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1cfe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1cff0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
1d000 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1d010 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1d020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d030 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1d040 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e   Read the curren
1d050 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20  t value at byte 
1d060 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20  24. */.  pPgHdr 
1d070 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1d080 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65  pPage);.  change
1d090 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1d0a0 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1d0b0 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63  , 24);..  /* Inc
1d0c0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1d0d0 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1d0e0 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1d0f0 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1d100 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1d110 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 68    store32bits(ch
1d120 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50  ange_counter, pP
1d130 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a  gHdr, 24);..  /*
1d140 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
1d150 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
1d160 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1d170 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72  nref(pPage);.  r
1d180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1d1a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d1b0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1d1c0 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1d1d0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1d1e0 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1d1f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1d200 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1d210 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1d220 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1d230 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1d240 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1d250 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1d260 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1d270 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1d280 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1d290 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1d2a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d2b0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1d2c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1d2d0 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1d2e0 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1d2f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d300 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1d310 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1d320 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1d330 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1d340 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1d350 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1d360 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1d370 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1d380 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d390 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1d3a0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1d3b0 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1d3c0 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1d3d0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1d3e0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1d3f0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1d400 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
1d410 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
1d420 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
1d430 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
1d440 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
1d450 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
1d460 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
1d470 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
1d480 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1d490 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69  databases)..*/.i
1d4a0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1d4b0 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
1d4c0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
1d4d0 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
1d4e0 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
1d4f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d500 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
1d510 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
1d520 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
1d530 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
1d540 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1d550 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
1d560 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
1d570 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1d580 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
1d590 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
1d5a0 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
1d5b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
1d5c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1d5d0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1d5e0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1d5f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1d600 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
1d610 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1d620 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
1d630 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1d640 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d650 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1d660 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
1d670 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d680 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
1d690 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1d6a0 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
1d6b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1d6c0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
1d6d0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
1d6e0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
1d6f0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
1d700 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
1d710 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
1d720 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
1d730 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
1d740 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
1d750 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
1d760 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
1d770 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
1d780 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1d790 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
1d7a0 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
1d7b0 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
1d7c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1d7d0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1d7e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1d7f0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1d800 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
1d810 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d820 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d830 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
1d840 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1d850 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
1d860 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1d870 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1d880 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
1d890 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
1d8a0 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
1d8b0 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
1d8c0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
1d8d0 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
1d8e0 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
1d8f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d900 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1d910 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
1d920 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1d930 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64   i;.        void
1d940 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1d950 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
1d960 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1d970 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
1d980 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
1d990 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d9a0 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
1d9b0 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
1d9c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
1d9d0 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
1d9e0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1da00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1da10 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1da20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1da30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1da40 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1da50 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1da60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1da70 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1da80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1da90 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1daa0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1dab0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1dac0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1dad0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1dae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
1daf0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1db00 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
1db10 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1db20 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1db30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1db40 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1db50 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
1db60 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1db70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1db80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1db90 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1dba0 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
1dbb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1dbc0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1dbd0 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1dbe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dbf0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1dc00 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1dc10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dc20 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1dc30 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1dc40 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
1dc50 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
1dc60 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
1dc70 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1dc80 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1dc90 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1dca0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1dcb0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1dcc0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1dcd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dce0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1dcf0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
1dd00 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1dd10 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1dd20 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1dd30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1dd40 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1dd50 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
1dd60 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
1dd70 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
1dd80 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  NCED;.  }..sync_
1dd90 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1dda0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1ddb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ddc0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
1ddd0 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
1dde0 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
1ddf0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
1de00 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
1de10 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1de20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1de30 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1de40 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1de50 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1de60 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1de70 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1de80 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1de90 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1dea0 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1deb0 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1dec0 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1ded0 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1dee0 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1def0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1df00 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1df10 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1df20 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1df30 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1df40 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1df50 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1df60 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1df70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1df80 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1df90 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1dfa0 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1dfb0 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1dfc0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1dfd0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1dfe0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1dff0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1e000 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1e010 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e020 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
1e030 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
1e040 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1e050 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
1e060 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
1e070 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
1e080 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
1e090 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
1e0a0 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
1e0b0 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
1e0c0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
1e0d0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
1e0e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1e0f0 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1e100 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1e110 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1e120 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1e130 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1e140 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1e150 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1e160 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1e170 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1e180 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1e190 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1e1a0 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1e1b0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1e1c0 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1e1d0 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1e1e0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1e1f0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1e200 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  nc, pgno);..  if
1e210 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1e220 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
1e230 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1e240 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1e250 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1e260 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1e270 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
1e280 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1e290 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
1e2a0 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1e2b0 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1e2c0 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1e2d0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1e2e0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1e2f0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1e300 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1e310 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
1e320 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
1e330 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
1e340 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
1e350 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1e360 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
1e370 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
1e380 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
1e390 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
1e3a0 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
1e3b0 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
1e3c0 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
1e3d0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
1e3e0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1e3f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1e400 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
1e410 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1e420 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1e430 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
1e440 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
1e450 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69  ;.    pPgOld->di
1e460 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1e470 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
1e480 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1e490 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
1e4a0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
1e4b0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1e4c0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1e4d0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1e4e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e4f0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1e500 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
1e510 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1e520 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1e530 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1e540 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1e550 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e  n. */.  pPg->pgn
1e560 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
1e570 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
1e580 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e590 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1e5a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e5b0 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1e5c0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1e5d0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1e5e0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1e5f0 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1e600 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1e610 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1e620 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1e630 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1e640 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67  Hash = 0;..  pPg
1e650 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70  ->dirty = 1;.  p
1e660 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1e670 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
1e680 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
1e690 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
1e6a0 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
1e6b0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1e6c0 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
1e6d0 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
1e6e0 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
1e6f0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1e700 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1e710 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
1e720 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
1e730 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
1e740 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
1e750 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
1e760 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
1e770 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
1e780 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
1e790 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
1e7a0 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
1e7b0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
1e7c0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1e7d0 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
1e7e0 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1e7f0 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
1e800 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e810 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e820 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
1e830 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
1e840 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
1e850 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
1e860 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1e870 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
1e880 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
1e890 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65  ;.    void *pNee
1e8a0 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72  dSync;.    asser
1e8b0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e8c0 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
1e8d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e8e0 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
1e8f0 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e  cPgno, &pNeedSyn
1e900 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
1e910 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1e920 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
1e930 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1e940 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1e950 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e  DR(pNeedSync)->n
1e960 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1e970 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1e980 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75  NeedSync)->inJou
1e990 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41  rnal = 1;.    DA
1e9a0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1e9b0 64 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20  dSync)->dirty = 
1e9c0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  1;.    sqlite3pa
1e9d0 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53  ger_unref(pNeedS
1e9e0 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ync);.  }..  ret
1e9f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ea00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1ea10 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1ea20 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1ea30 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1ea40 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1ea50 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1ea60 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
1ea70 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
1ea80 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1ea90 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
1eaa0 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
1eab0 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
1eac0 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
1ead0 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
1eae0 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
1eaf0 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
1eb00 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
1eb10 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
1eb20 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
1eb30 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
1eb40 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1eb50 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1eb60 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
1eb70 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
1eb80 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
1eb90 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
1eba0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1ebb0 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
1ebc0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
1ebd0 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
1ebe0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
1ebf0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1ec00 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
1ec10 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
1ec20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ec30 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1ec40 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
1ec50 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
1ec60 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
1ec70 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
1ec80 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
1ec90 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
1eca0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
1ecb0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
1ecc0 2f 0a                                            /.