/ Hex Artifact Content
Login

Artifact c9fdc3f4026f22e73d8fa586c4f58e14129036bb:


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 35  : pager.c,v 1.25
0350: 36 20 32 30 30 36 2f 30 31 2f 32 34 20 31 33 3a  6 2006/01/24 13:
0360: 30 39 3a 33 33 20 64 61 6e 69 65 6c 6b 31 39 37  09:33 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20   TRACE1(X)      
0450: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0460: 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 54  ntf(X).#define T
0470: 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20 73  RACE2(X,Y)     s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54  f(X,Y).#define T
04a0: 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73  RACE3(X,Y,Z)   s
04b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
04c0: 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  f(X,Y,Z).#define
04d0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65  ntf(X,Y,Z,W).#de
0500: 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c  fine TRACE5(X,Y,
0510: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0540: 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64 65  ne TRACE1(X).#de
0550: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0560: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
0570: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54  X,Y,Z).#define T
0580: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23  RACE4(X,Y,Z,W).#
0590: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
05a0: 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66 0a  Y,Z,W,V).#endif.
05b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
05c0: 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20  wing two macros 
05d0: 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20  are used within 
05e0: 74 68 65 20 54 52 41 43 45 58 28 29 20 6d 61 63  the TRACEX() mac
05f0: 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ros above.** to 
0600: 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64  print out file-d
0610: 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a  escriptors. .**.
0620: 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61 6b  ** PAGERID() tak
0630: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
0640: 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20 61  a Pager struct a
0650: 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e  s it's argument.
0660: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0670: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0680: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0690: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
06a0: 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a  akes an OsFile.*
06b0: 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73  * struct as it's
06c0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64   argument..*/.#d
06d0: 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29  efine PAGERID(p)
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 26 28   FILEHANDLEID(&(
06f0: 70 29 2d 3e 66 64 29 0a 23 64 65 66 69 6e 65 20  p)->fd).#define 
0700: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0710: 20 28 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 48   (sqlite3OsFileH
0720: 61 6e 64 6c 65 28 26 66 64 29 29 0a 0a 2f 2a 0a  andle(&fd))../*.
0730: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0740: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0750: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
0760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0770: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
0780: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
0790: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07a0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07b0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
07c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
07d0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
07e0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
07f0: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0800: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0810: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0820: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0830: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0840: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0860: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
0870: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
0880: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0890: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
08d0: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
08e0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0910: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0920: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0940: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0950: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
0960: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
0970: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
0980: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
0990: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09a0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
09c0: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
09d0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
09e0: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
09f0: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a20: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a30: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a40: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0a70: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0a80: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0ab0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0ac0: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0ad0: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0ae0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0af0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b00: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b10: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b20: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b30: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0b60: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0b70: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0b80: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0ba0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bb0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0bc0: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0bf0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c00: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c10: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c20: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c30: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c40: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0c60: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0c70: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0c80: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cb0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0cc0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0cd0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0cf0: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d00: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d10: 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0d40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0d50: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0d80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0d90: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0da0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0db0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0dc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
0dd0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
0de0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0df0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0e00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0e10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0e20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0e30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0e40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0e50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0e70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0e80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0e90: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0ea0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0eb0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ec0: 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  ons to.** PAGER_
0ed0: 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65  RESERVED.  (Note
0ee0: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0ef0: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0f00: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0f10: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0f20: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0f30: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0f40: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0f50: 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66  PAGER_SHARED bef
0f60: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0f70: 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45  ns to PAGER_RESE
0f80: 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72  RVED.).** The tr
0f90: 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45  ansition to PAGE
0fa0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75  R_EXCLUSIVE occu
0fb0: 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61  rs when before a
0fc0: 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ny changes.** ar
0fd0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
0fe0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66  tabase file.  Af
0ff0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61  ter an sqlite3pa
1000: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a  ger_rollback().*
1010: 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65  * or sqlite_page
1020: 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20  r_commit(), the 
1030: 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20  state goes back 
1040: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
1050: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
1060: 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a  R_UNLOCK      0.
1070: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48  #define PAGER_SH
1080: 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a  ARED      1   /*
1090: 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f   same as SHARED_
10a0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
10b0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20  PAGER_RESERVED  
10c0: 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    2   /* same as
10d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a   RESERVED_LOCK *
10e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
10f0: 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20  EXCLUSIVE   4   
1100: 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55  /* same as EXCLU
1110: 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  SIVE_LOCK */.#de
1120: 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45  fine PAGER_SYNCE
1130: 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20  D      5../*.** 
1140: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  If the SQLITE_BU
1150: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1160: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f   macro is set to
1170: 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65   true at compile
1180: 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66  -time,.** then f
1190: 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74  ailed attempts t
11a0: 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64  o get a reserved
11b0: 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b   lock will invok
11c0: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
11d0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ack..** This is 
11e0: 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20  off by default. 
11f0: 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e   To see why, con
1200: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1210: 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a  ing scenario:.**
1220: 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72   .** Suppose thr
1230: 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61  ead A already ha
1240: 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
1250: 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65  and wants a rese
1260: 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68  rved lock..** Th
1270: 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68  read B already h
1280: 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  as a reserved lo
1290: 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20  ck and wants an 
12a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
12b0: 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65   If.** both thre
12c0: 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68  ads are using th
12d0: 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63  eir busy callbac
12e0: 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ks, it might be 
12f0: 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62  a long time.** b
1300: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
1310: 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70   threads give up
1320: 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20   and allows the 
1330: 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64  other to proceed
1340: 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
1350: 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f  thread trying to
1360: 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65   get the reserve
1370: 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20  d lock gives up 
1380: 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69  quickly.** (if i
1390: 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20  t never invokes 
13a0: 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63  its busy callbac
13b0: 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  k) then the cont
13c0: 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a  ention will be.*
13d0: 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b  * resolved quick
13e0: 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ly..*/.#ifndef S
13f0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1400: 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  VED_LOCK.# defin
1410: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
1420: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65  SERVED_LOCK 0.#e
1430: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1440: 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61   macro rounds va
1450: 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20  lues up so that 
1460: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1470: 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a  an address it.**
1480: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1490: 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20  o be an address 
14a0: 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20  that is aligned 
14b0: 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  to an 8-byte bou
14c0: 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ndary..*/.#defin
14d0: 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  e FORCE_ALIGNMEN
14e0: 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26  T(X)   (((X)+7)&
14f0: 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ~7)../*.** Each 
1500: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  in-memory image 
1510: 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73  of a page begins
1520: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
1530: 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54  ing header..** T
1540: 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e  his header is on
1550: 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68  ly visible to th
1560: 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e  is pager module.
1570: 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20    The client.** 
1580: 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20  code that calls 
1590: 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20  pager sees only 
15a0: 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  the data that fo
15b0: 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72  llows the header
15c0: 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63  ..**.** Client c
15d0: 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  ode should call 
15e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
15f0: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1600: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1610: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1620: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1630: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1640: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  e sqlite3pager_w
1650: 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c  rite().** is cal
1660: 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  led, the origina
1670: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
1680: 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1690: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a   the rollback.**
16a0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48   journal and PgH
16b0: 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64  dr.inJournal and
16c0: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
16d0: 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c  are set.  Later,
16e0: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75   once.** the jou
16f0: 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61  rnal page has ma
1700: 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64  de it onto the d
1710: 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48  isk surface, PgH
1720: 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69  dr.needSync.** i
1730: 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20  s cleared.  The 
1740: 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61  modified page ca
1750: 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20  nnot be written 
1760: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72  back into the or
1770: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1780: 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  se file until th
1790: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20  e journal pages 
17a0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
17b0: 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a  to disk and the.
17c0: 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  ** PgHdr.needSyn
17d0: 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  c has been clear
17e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67  ed..**.** The Pg
17f0: 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69  Hdr.dirty flag i
1800: 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74  s set when sqlit
1810: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1820: 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a  is called and.**
1830: 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69   is cleared agai
1840: 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  n when the page 
1850: 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74  content is writt
1860: 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f  en back to the o
1870: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
1880: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70  ase file..*/.typ
1890: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
18a0: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
18b0: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
18c0: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
18f0: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
1900: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1930: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
1940: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
1950: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
1960: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
1970: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
1980: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
1990: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19a0: 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72  xtFree, *pPrevFr
19b0: 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74  ee;  /* Freelist
19c0: 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20   of pages where 
19d0: 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  nRef==0 */.  PgH
19e0: 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20  dr *pNextAll;   
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a00: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
1a10: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
1a20: 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76  NextStmt, *pPrev
1a30: 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f  Stmt;  /* List o
1a40: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
1a50: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1a60: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1a70: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1a80: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1a90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1aa0: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1ab0: 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20   u8 inStmt;     
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68  /* TRUE if in th
1ae0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
1af0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
1b00: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b20: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
1b30: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
1b40: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
1b50: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
1b70: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
1b80: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
1b90: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
1ba0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
1bb0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
1bc0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1bd0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1be0: 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65  .  short int nRe
1bf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1c00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1c10: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
1c20: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  e */.  PgHdr *pD
1c30: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1c40: 20 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70        /* Dirty p
1c50: 61 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50  ages sorted by P
1c60: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66  gHdr.pgno */.#if
1c70: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1c80: 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67  _PAGES.  u32 pag
1c90: 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20  eHash;.#endif.  
1ca0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /* pPager->pageS
1cb0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67  ize bytes of pag
1cc0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
1cd0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1ce0: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1cf0: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1d00: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1d10: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1d20: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1d30: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1d40: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1d50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1d60: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1d70: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
1d80: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
1d90: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1da0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
1db0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
1dc0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1dd0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1de0: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1df0: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1e00: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1e10: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1e20: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e30: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1e40: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e50: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1e60: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1e70: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
1e80: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
1e90: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
1ea0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
1eb0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
1ec0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
1ed0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1ee0: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1ef0: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1f00: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1f10: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1f20: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1f30: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1f40: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1f50: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1f60: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1f70: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
1f80: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
1f90: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
1fa0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
1fb0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
1fc0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
1fd0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
1fe0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
1ff0: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
2000: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2010: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2020: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
2030: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
2040: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
2050: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
2060: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
2070: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
2080: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
2090: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  DEC(P,D,N,X) if(
20a0: 20 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d   P->xCodec ){ P-
20b0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
20c0: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
20d0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f  else.# define CO
20e0: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e  DEC(P,D,N,X).#en
20f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2100: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2110: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2120: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2130: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2140: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2150: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2160: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2170: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2180: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
2190: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
21a0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
21b0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
21c0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
21d0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
21e0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
21f0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2200: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2210: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2220: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2230: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2240: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2250: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2260: 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65   How big to make
2270: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2280: 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e  used for locatin
2290: 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  g in-memory page
22a0: 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d  s.** by page num
22b0: 62 65 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  ber. This macro 
22c0: 6c 6f 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73  looks a little s
22d0: 69 6c 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61  illy, but is eva
22e0: 6c 75 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d  luated.** at com
22f0: 70 69 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72  pile-time, not r
2300: 75 6e 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73  un-time (at leas
2310: 74 20 66 6f 72 20 67 63 63 20 74 68 69 73 20 69  t for gcc this i
2320: 73 20 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66  s true)..*/.#def
2330: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c  ine N_PG_HASH (\
2340: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30  .  (MAX_PAGES>10
2350: 32 34 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d  24)?2048: \.  (M
2360: 41 58 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30  AX_PAGES>512)?10
2370: 32 34 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  24: \.  (MAX_PAG
2380: 45 53 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20  ES>256)?512: \. 
2390: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29   (MAX_PAGES>128)
23a0: 3f 32 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50  ?256: \.  (MAX_P
23b0: 41 47 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20  AGES>64)?128:64 
23c0: 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  \.)../*.** Hash 
23d0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
23e0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
23f0: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
2400: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
2410: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
2420: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
2430: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2440: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2450: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
2460: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
2470: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
2480: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
2490: 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  , SQLITE_PROTOCO
24a0: 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46  L.** or SQLITE_F
24b0: 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66  ULL. Once one of
24c0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
24d0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20   errors occurs, 
24e0: 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61  it persists.** a
24f0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  nd is returned a
2500: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
2510: 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65  every major page
2520: 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65  r API call.  The
2530: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
2540: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2550: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
2560: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
2570: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
2580: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
2590: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
25a0: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
25b0: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
25c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
25d0: 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
25e0: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
25f0: 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  _get() and sqlit
2600: 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
2610: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
2620: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
2630: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
2640: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2650: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2660: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2670: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2680: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2690: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
26a0: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
26b0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
26c0: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
26d0: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
26e0: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
26f0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2700: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
2710: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
2720: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2730: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2750: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2760: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2770: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2780: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
27b0: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
27c0: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
27d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27e0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
27f0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
2800: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
2810: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
2820: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2830: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2840: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2850: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2860: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2880: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2890: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
28a0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
28b0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
28c0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
28d0: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
28e0: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
28f0: 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  ss */.  u8 state
2900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2910: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
2920: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
2930: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
2940: 0a 20 20 75 38 20 65 72 72 43 6f 64 65 3b 20 20  .  u8 errCode;  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2960: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
2970: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
2980: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2990: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29a0: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
29b0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
29c0: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
29d0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
29e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
29f0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
2a00: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2a10: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2a20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a30: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2a40: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2a50: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2a60: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2a70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a80: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2a90: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2aa0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2ab0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
2ac0: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
2ad0: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
2ae0: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
2af0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
2b00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2b10: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
2b20: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65  e I/O */.  u8 se
2b30: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2b40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b50: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
2b60: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2b70: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20 64   jrnl */.  int d
2b80: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2b90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ba0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2bb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
2bc0: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
2bd0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
2be0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
2bf0: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
2c00: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c20: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2c30: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
2c40: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
2c50: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2c80: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2c90: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
2ca0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
2cb0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
2cc0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
2cd0: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
2ce0: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
2cf0: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
2d00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d10: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
2d20: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
2d30: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d50: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
2d60: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
2d70: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2d80: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2da0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2db0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
2dc0: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2de0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
2df0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
2e00: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67 65  /.  int nMaxPage
2e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e20: 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d 61  /* High water ma
2e30: 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20  rk of nPage */. 
2e40: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
2e70: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
2e80: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
2e90: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2ec0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
2ed0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  in cache */.  u8
2ee0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
2ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2f00: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2f10: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2f20: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
2f30: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
2f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f50: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f60: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f70: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
2f80: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2f90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2fa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
2fc0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2fd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
2ff0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
3000: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
3010: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
3020: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
3030: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
3040: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  OsFile *fd, *jfd
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
3060: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
3070: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
3080: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
3090: 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  File *stfd;     
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
30b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
30c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
30d0: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
30e0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
30f0: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
3100: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
3110: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
3120: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
3130: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
3140: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
3150: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
3160: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
3170: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
3180: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
3190: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
31a0: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
31d0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
31e0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
31f0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
3200: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
3210: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3220: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3230: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
3240: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
3250: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
3260: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3270: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
3280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3290: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
32a0: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
32b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
32c0: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
32d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
32e0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
32f0: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
3300: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
3310: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
3330: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
3340: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
3350: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
3360: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3370: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
3380: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
3390: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
33a0: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
33b0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
33c0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
33d0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
33e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33f0: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3400: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
3410: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
3420: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
3430: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
3440: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
3450: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3460: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
3470: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
3480: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
3490: 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a  estructor)(void*
34a0: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
34b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
34c0: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
34d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
34e0: 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  iter)(void*,int)
34f0: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
3500: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
3510: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
3520: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
3530: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3540: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3550: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3560: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3570: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3590: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
35a0: 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 50 67 48  Codec() */.  PgH
35b0: 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48  dr *aHash[N_PG_H
35c0: 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68  ASH];    /* Hash
35d0: 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61   table to map pa
35e0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48  ge number to PgH
35f0: 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  dr */.#ifdef SQL
3600: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3610: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3620: 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20  ager *pNext;    
3630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
3640: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
3650: 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65  ers in this thre
3660: 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ad */.#endif.};.
3670: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
3680: 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65 64  _TEST is defined
3690: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
36a0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 67 69 76  the variable giv
36b0: 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67  en in.** the arg
36c0: 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20  ument.*/.#ifdef 
36d0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65  SQLITE_TEST.# de
36e0: 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78  fine TEST_INCR(x
36f0: 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  x++.#else.# d
3700: 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28  efine TEST_INCR(
3710: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
3720: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3730: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3740: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3750: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3760: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3770: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3780: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3790: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
37a0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
37b0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
37c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
37d0: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
37e0: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
37f0: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3800: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3810: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3820: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3830: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
3840: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3850: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3860: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3870: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3880: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3890: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
38a0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
38b0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
38c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
38d0: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
38e0: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
38f0: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3900: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3910: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3920: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3930: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3940: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3950: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3960: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3970: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3980: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3990: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
39a0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
39b0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
39c0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
39d0: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
39e0: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
39f0: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
3a00: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
3a10: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
3a20: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
3a30: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
3a40: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
3a50: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
3a60: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
3a70: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
3a80: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3a90: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
3aa0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
3ab0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
3ac0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
3ad0: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
3ae0: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
3af0: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
3b00: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
3b10: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
3b20: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
3b30: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
3b40: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
3b50: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
3b60: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
3b70: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
3b80: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
3b90: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
3ba0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
3bb0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
3bc0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
3bd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
3be0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
3bf0: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
3c00: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
3c10: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
3c20: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
3c30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
3c40: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
3c50: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
3c60: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
3c70: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
3c80: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
3c90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
3ca0: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
3cb0: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
3cc0: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
3cd0: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
3ce0: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
3cf0: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
3d00: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
3d10: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
3d20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3d30: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
3d40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
3d50: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
3d60: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
3d70: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
3d80: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
3d90: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
3da0: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
3db0: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
3dc0: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
3dd0: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
3de0: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
3df0: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
3e00: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
3e10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
3e20: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
3e30: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
3e40: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
3e50: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
3e60: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
3e70: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
3e80: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
3e90: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
3ea0: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
3eb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3ec0: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
3ed0: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
3ee0: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
3ef0: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
3f00: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
3f10: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
3f20: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
3f30: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
3f40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3f50: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3f60: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
3f70: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
3f80: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
3f90: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
3fa0: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  ** The default s
3fb0: 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65  ize of a disk se
3fc0: 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ctor.*/.#define 
3fd0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
3fe0: 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  E 512../*.** Pag
3ff0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
4000: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
4010: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
4020: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4030: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4040: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4050: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4060: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4070: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4080: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
4090: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
40a0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
40b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40c0: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
40d0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
40e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
40f0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
4100: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
4110: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
4120: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4130: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4140: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4150: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4160: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4170: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4180: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
4190: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
41a0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
41b0: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
41c0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
41d0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
41e0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
41f0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4200: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4210: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4220: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4230: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4240: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4250: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4260: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4270: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4280: 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  UG.  int pager3_
4290: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
42a0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
42b0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
42c0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
42d0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
42e0: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
42f0: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4300: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
4310: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4320: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
4330: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
4340: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
4350: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44     p->pgno, PGHD
4360: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
4370: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4380: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
4390: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
43a0: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
43b0: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
43c0: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
43d0: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
43e0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
43f0: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  O(X).#endif../*.
4400: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4410: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4420: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4430: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4440: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4450: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4460: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4470: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4480: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4490: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
44a0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
44b0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
44c0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
44d0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
44e0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
44f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4500: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4510: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4520: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4530: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4540: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4550: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4560: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4580: 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32  pRes = (ac[0]<<2
4590: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
45a0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
45b0: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ac[3];.  }.  ret
45c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
45d0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
45e0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
45f0: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
4600: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
4610: 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
4620: 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73 28   void put32bits(
4630: 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61  char *ac, u32 va
4640: 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  l){.  ac[0] = (v
4650: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
4660: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
4670: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
4680: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
4690: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
46a0: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
46b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
46c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
46d0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
46e0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
46f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
4700: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
4710: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
4720: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4730: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
4740: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
4750: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
4760: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
4770: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
4780: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
4790: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
47a0: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
47b0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
47c0: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
47d0: 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20   'val' into the 
47e0: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
47f0: 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a  by page header.*
4800: 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20  * 'p' at offset 
4810: 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61  'offset'..*/.sta
4820: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32  tic void store32
4830: 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67  bits(u32 val, Pg
4840: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
4850: 65 74 29 7b 0a 20 20 63 68 61 72 20 2a 61 63 3b  et){.  char *ac;
4860: 0a 20 20 61 63 20 3d 20 26 28 28 63 68 61 72 2a  .  ac = &((char*
4870: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4880: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 70 75  ))[offset];.  pu
4890: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
48a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
48b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
48c0: 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73   at offset 'offs
48d0: 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67  et' from the pag
48e0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  e identified by.
48f0: 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27  ** page header '
4900: 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  p'..*/.static u3
4910: 32 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  2 retrieve32bits
4920: 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f  (PgHdr *p, int o
4930: 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e  ffset){.  unsign
4940: 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61  ed char *ac;.  a
4950: 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20  c = &((unsigned 
4960: 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
4970: 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b  ATA(p))[offset];
4980: 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d  .  return (ac[0]
4990: 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c  <<24) | (ac[1]<<
49a0: 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29  16) | (ac[2]<<8)
49b0: 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a   | ac[3];.}.../*
49c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
49d0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
49e0: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
49f0: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
4a00: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
4a10: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
4a20: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
4a30: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
4a40: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
4a50: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
4a60: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
4a70: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
4a80: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
4a90: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
4aa0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
4ab0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
4ac0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
4ad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
4ae0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
4af0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
4b00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
4b10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
4b20: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c  SQLITE_PROTOCOL,
4b30: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
4b40: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
4b50: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
4b60: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
4b70: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
4b80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
4b90: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
4ba0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
4bb0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
4bc0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
4bd0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 61 73 73  , int rc){.  ass
4be0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
4bf0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4c00: 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  L || pPager->err
4c10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
4c20: 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63  );.  if( .    rc
4c30: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
4c40: 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f  .    rc==SQLITE_
4c50: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 3d  IOERR ||.    rc=
4c60: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
4c70: 7c 7c 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  ||.    rc==SQLIT
4c80: 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a  E_PROTOCOL.  ){.
4c90: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4ca0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
4cb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
4cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
4cd0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
4ce0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
4cf0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
4d00: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
4d10: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
4d20: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
4d30: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32  r *pPage){.  u32
4d40: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
4d50: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
4d60: 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e  har *pData = (un
4d70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
4d80: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
4d90: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
4da0: 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  <pPage->pPager->
4db0: 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  pageSize; i++){.
4dc0: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
4dd0: 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20  +i)^pData[i];.  
4de0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
4df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
4e00: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
4e10: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
4e20: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
4e30: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
4e40: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
4e50: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
4e60: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
4e70: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
4e80: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
4e90: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
4ea0: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
4eb0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
4ec0: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
4ed0: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
4ee0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
4ef0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
4f00: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
4f10: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
4f20: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
4f30: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
4f40: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
4f50: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
4f60: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
4f70: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
4f80: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
4f90: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
4fa0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
4fb0: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
4fc0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
4fd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
4fe0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
4ff0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
5000: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
5010: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
5020: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
5030: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5040: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
5050: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
5060: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
5070: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
5080: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5090: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70  liteMalloc(). *p
50a0: 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65  zMaster is.** se
50b0: 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  t to point at th
50c0: 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  e memory and SQL
50d0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
50e0: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
50f0: 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29  .** sqliteFree()
5100: 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a   *pzMaster..**.*
5110: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
5120: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5130: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d   is present *pzM
5140: 61 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  aster is set to 
5150: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
5160: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
5170: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
5180: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46  asterJournal(OsF
5190: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
51a0: 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20   **pzMaster){.  
51b0: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65  int rc;.  u32 le
51c0: 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20  n;.  i64 szJ;.  
51d0: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
51e0: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
51f0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
5200: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
5210: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
5220: 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73  der */..  *pzMas
5230: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  ter = 0;..  rc =
5240: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
5250: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
5260: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5270: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
5280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5290: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
52a0: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29  k(pJrnl, szJ-16)
52b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
52c0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
52d0: 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64  c;. .  rc = read
52e0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c  32bits(pJrnl, &l
52f0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5300: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5310: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
5320: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5330: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5350: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5360: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
5370: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
5380: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5390: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
53a0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
53b0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
53c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
53d0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
53e0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  rnl, szJ-16-len)
53f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5400: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5410: 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  c;..  *pzMaster 
5420: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
5430: 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20  Malloc(len+1);. 
5440: 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20   if( !*pzMaster 
5450: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5460: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
5470: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5480: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
5490: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
54a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
54b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
54c0: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
54d0: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
54e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
54f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
5500: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
5510: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
5520: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
5530: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
5540: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
5550: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
5560: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
5570: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5580: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5590: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
55a0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
55b0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
55c0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
55d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
55e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
55f0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5600: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5610: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
5620: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
5630: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
5640: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
5650: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
5660: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5670: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5680: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
5690: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
56a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c  aster = 0;.  }el
56b0: 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74  se{.    (*pzMast
56c0: 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  er)[len] = '\0';
56d0: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
56e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
56f0: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
5700: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
5710: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
5720: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
5730: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
5740: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
5750: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
5760: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
5770: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
5780: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
5790: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
57a0: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
57b0: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
57c0: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
57d0: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
57e0: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
57f0: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
5860: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5870: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
5880: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
5890: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
58a0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
58b0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
58c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
58d0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
58e0: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
58f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5900: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
5910: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
5920: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5930: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
5940: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5950: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5960: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5970: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5980: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5990: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
59a0: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
59b0: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
59c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
59d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
59e0: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
59f0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65  urn sqlite3OsSee
5a00: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
5a10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5a20: 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  f);.}../*.** The
5a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
5a40: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
5a50: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5a60: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5a70: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
5a80: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
5a90: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
5aa0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
5ab0: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
5ac0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
5ad0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5ae0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
5af0: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
5b00: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
5b10: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
5b20: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
5b30: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
5b40: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
5b50: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
5b60: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
5b70: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
5b80: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
5b90: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
5ba0: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
5bb0: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
5bc0: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
5bd0: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
5be0: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
5bf0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
5c00: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
5c10: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
5c20: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
5c30: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
5c40: 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66  Z - 24) bytes of
5c50: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
5c60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5c70: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
5c80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63  er *pPager){.  c
5c90: 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65  har zHeader[size
5ca0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
5cb0: 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20 72 63  )+16];..  int rc
5cc0: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5cd0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5ce0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5cf0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5d00: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5d10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5d20: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5d30: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5d40: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5d50: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5d60: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5d70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5d80: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5d90: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
5da0: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
5db0: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
5dc0: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
5dd0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
5de0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
5df0: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
5e00: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
5e10: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
5e20: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
5e30: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
5e40: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
5e50: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
5e60: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
5e70: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
5e80: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
5e90: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
5ea0: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
5eb0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ..  */.  memcpy(
5ec0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
5ed0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
5ee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
5ef0: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
5f00: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
5f10: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
5f20: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32  nals. */.  put32
5f30: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
5f40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5f50: 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f  ic)], pPager->no
5f60: 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66  Sync ? 0xfffffff
5f70: 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65  f : 0);.  /* The
5f80: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
5f90: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
5fa0: 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64  / .  sqlite3Rand
5fb0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
5fc0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
5fd0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
5fe0: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
5ff0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6000: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6010: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
6020: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
6030: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
6040: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
6050: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6060: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6070: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
6080: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
6090: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
60a0: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
60b0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
60c0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
60d0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
60e0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
60f0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6100: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
6110: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6120: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
6130: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a  zeof(zHeader));.
6140: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
6150: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
6160: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
6170: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
6180: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
6190: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
61a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
61b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
61c0: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
61d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
61e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
61f0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
6200: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
6210: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
6220: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6230: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
6240: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
6250: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  (pPager->jfd, "\
6260: 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  000", 1);.    }.
6270: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
6290: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
62a0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
62b0: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
62c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
62d0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
62e0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
62f0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
6300: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
6310: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
6320: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
6330: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
6340: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
6350: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
6360: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
6370: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6380: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
6390: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
63a0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
63b0: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
63c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
63d0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
63e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
63f0: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
6400: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
6410: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
6420: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
6430: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
6440: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
6450: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
6460: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
6470: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
6480: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
6490: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
64a0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
64b0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
64c0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
64d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
64e0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
64f0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
6500: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
6510: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
6520: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
6530: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
6540: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6550: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
6560: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
6570: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
6580: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
6590: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
65a0: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
65b0: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
65c0: 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f  Pager, .  i64 jo
65d0: 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32  urnalSize,.  u32
65e0: 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20   *pNRec, .  u32 
65f0: 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e  *pDbSize.){.  in
6600: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
6610: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
6620: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
6630: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
6640: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d  eader */..  rc =
6650: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
6660: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
6670: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6680: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6690: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
66a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
66b0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
66c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
66d0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
66e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
66f0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
6700: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
6710: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
6720: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6730: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
6740: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6750: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6760: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
6770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6780: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
6790: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
67a0: 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20  >jfd, pNRec);.  
67b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
67c0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
67d0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
67e0: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
67f0: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
6800: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6820: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6830: 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  DbSize);.  if( r
6840: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6850: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
6860: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
6870: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
6880: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
6890: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
68a0: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
68b0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
68c0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
68d0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
68e0: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
68f0: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
6900: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6910: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  .  ** is being c
6920: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
6930: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6940: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
6950: 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65  lue.  ** of Page
6960: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
6970: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
6980: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
6990: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ine..  */.  rc =
69a0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
69b0: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
69c0: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
69d0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
69e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
69f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6a00: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
6a10: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
6a20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
6a30: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
6a40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6a50: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
6a60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
6a70: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
6a80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6a90: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
6aa0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
6ab0: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
6ac0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
6ad0: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
6ae0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
6af0: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
6b00: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
6b10: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
6b20: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
6b30: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
6b40: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
6b50: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
6b60: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
6b70: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
6b80: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
6b90: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
6ba0: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
6bb0: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
6bc0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
6bd0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e  _MJ_PGNO..** + N
6be0: 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f   bytes: length o
6bf0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
6c00: 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79   name..** + 4 by
6c10: 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79  tes: N.** + 4 by
6c20: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
6c30: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
6c40: 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a  m..** + 8 bytes:
6c50: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
6c60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
6c70: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
6c80: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
6c90: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
6ca0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
6cb0: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  * journal name..
6cc0: 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
6cd0: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
6ce0: 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
6cf0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
6d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
6d10: 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
6d20: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
6d30: 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
6d40: 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
6d50: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
6d60: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
6d70: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
6d80: 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20  en; .  int i; . 
6d90: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a   u32 cksum = 0;.
6da0: 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65    char zBuf[size
6db0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6dc0: 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21  )+2*4];..  if( !
6dd0: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
6de0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
6df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6e00: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
6e10: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
6e20: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
6e30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6e40: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
6e50: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
6e60: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
6e70: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
6e80: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
6e90: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
6ea0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
6eb0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
6ec0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
6ed0: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
6ee0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
6ef0: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
6f00: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6f10: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
6f20: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
6f30: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
6f40: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
6f50: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6f60: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
6f70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6f80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
6f90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6fa0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
6fb0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
6fc0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6fd0: 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
6fe0: 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
6ff0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7000: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7010: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7020: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7030: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
7040: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7050: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
7060: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
7070: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
7080: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
7090: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
70a0: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
70b0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
70c0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
70d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
70e0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
70f0: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
7100: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7110: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
7120: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
7130: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72  >noSync;.  retur
7140: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
7150: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
7160: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
7170: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
7180: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
7190: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
71a0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
71b0: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
71c0: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
71d0: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
71e0: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
71f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7200: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
7210: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
7220: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _stmt_commit().*
7230: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7240: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7250: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
7260: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
7270: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
7280: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
7290: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
72a0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
72b0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
72c0: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
72d0: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
72e0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
72f0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7300: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
7310: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
7320: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7330: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
7340: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  Pg->pNextStmt==0
7350: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
7360: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
7370: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
7380: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
7390: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
73a0: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
73b0: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67  pNextStmt = pPag
73c0: 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61  er->pStmt;.  pPa
73d0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
73e0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
73f0: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
7400: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
7410: 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  rom_stmt_list(Pg
7420: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
7430: 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20   !pPg->inStmt ) 
7440: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
7450: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a  g->pPrevStmt ){.
7460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7470: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
7480: 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tStmt==pPg );.  
7490: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
74a0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
74b0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
74c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
74d0: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
74e0: 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pStmt==pPg );.  
74f0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
7500: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
7510: 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tStmt;.  }.  if(
7520: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7530: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7540: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
7550: 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b  PrevStmt==pPg );
7560: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53  .    pPg->pNextS
7570: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
7580: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b   pPg->pPrevStmt;
7590: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
75a0: 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  tStmt = 0;.  pPg
75b0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
75c0: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
75d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
75e0: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
75f0: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
7600: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
7610: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7620: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7630: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
7640: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
7650: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
7660: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
7670: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
7680: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70  {.  PgHdr *p = p
7690: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
76a0: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a  er_hash(pgno)];.
76b0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
76c0: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
76d0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
76e0: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
76f0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
7700: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
7710: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
7720: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
7730: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
7740: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
7750: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
7760: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
7770: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
7780: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
7790: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
77a0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
77b0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
77c0: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
77d0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
77e0: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
77f0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
7800: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
7810: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
7820: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
7830: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
7840: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
7850: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
7860: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7870: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
7880: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
7890: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
78a0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
78b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
78c0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
78d0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
78e0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
78f0: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
7900: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
7910: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
7920: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
7930: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
7940: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
7950: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
7960: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
7970: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
7980: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
7990: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
79a0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
79b0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
79c0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
79d0: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
79e0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
79f0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7a00: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7a10: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
7a20: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73  >nRef = 0;.  ass
7a30: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
7a40: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d  rnalOpen==0 );.}
7a50: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
7a60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7a70: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
7a80: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
7a90: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
7aa0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
7ab0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
7ac0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
7ad0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65  his routine rele
7ae0: 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ases.** the data
7af0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
7b00: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
7b10: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
7b20: 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a  e.  The journal.
7b30: 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  ** file is delet
7b40: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a  ed and closed..*
7b50: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
7b60: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
7b70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
7b80: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
7b90: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
7ba0: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
7bb0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
7bc0: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
7bd0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
7be0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
7bf0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
7c00: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7c10: 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74  int pager_unwrit
7c20: 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  elock(Pager *pPa
7c30: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7c40: 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Pg;.  int rc;.  
7c50: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
7c60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7c70: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
7c80: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
7c90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7ca0: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
7cb0: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
7cc0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
7cd0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
7ce0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7cf0: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
7d00: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
7d10: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
7d20: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7d30: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
7d40: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7d50: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
7d60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
7d70: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
7d80: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
7d90: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
7da0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
7db0: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
7dc0: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
7dd0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7de0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
7df0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
7e00: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
7e10: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
7e20: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
7e30: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
7e40: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
7e50: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
7e60: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7e70: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
7e80: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
7e90: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
7ea0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
7eb0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
7ec0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
7ed0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
7ee0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7ef0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7f00: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
7f10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7f20: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
7f30: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
7f40: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
7f50: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
7f60: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
7f70: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
7f80: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
7f90: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
7fa0: 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d  HARED;.  pPager-
7fb0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
7fc0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
7fd0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
7fe0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
7ff0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
8000: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
8010: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 72 65 74  r->pFirst;.  ret
8020: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8030: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
8040: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
8050: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
8060: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
8070: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
8080: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
8090: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
80a0: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
80b0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
80c0: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
80d0: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
80e0: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
80f0: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
8100: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
8110: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
8120: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
8130: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
8140: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
8150: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
8160: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
8170: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
8180: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
8190: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
81a0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
81b0: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
81c0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
81d0: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
81e0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
81f0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
8200: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
8210: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
8220: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
8230: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
8240: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
8250: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
8260: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
8270: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
8280: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
8290: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
82a0: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
82b0: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
82c0: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
82d0: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
82e0: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
82f0: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
8300: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
8310: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
8320: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
8330: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
8340: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
8350: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
8360: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
8370: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
8380: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
8390: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
83a0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
83b0: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
83c0: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
83d0: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
83e0: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
83f0: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
8400: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
8410: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
8420: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
8430: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
8440: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
8450: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
8460: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f  r, Pgno pgno, co
8470: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
8480: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
8490: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
84a0: 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
84b0: 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
84c0: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
84d0: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
84e0: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
84f0: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
8500: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
8510: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
8520: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
8530: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8540: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
8550: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
8560: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
8570: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
8580: 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d  useCksum==0 it m
8590: 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61  eans this journa
85a0: 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63  l does not use c
85b0: 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b  hecksums.  Check
85c0: 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  sums.** are not 
85d0: 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e  used in statemen
85e0: 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75  t journals becau
85f0: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  se statement jou
8600: 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20  rnals do not.** 
8610: 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20  need to survive 
8620: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a  power failures..
8630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8640: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
8650: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
8660: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
8670: 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b  , int useCksum){
8680: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
8690: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
86a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
86b0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
86c0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
86d0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
86f0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
8700: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
8710: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
8720: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
8730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
8740: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
8750: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
8760: 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c  /.  u8 aData[SQL
8770: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
8780: 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f  E];  /* Temp sto
8790: 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20  rage for a page 
87a0: 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75  */..  /* useCksu
87b0: 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65  m should be true
87c0: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f   for the main jo
87d0: 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20  urnal and false 
87e0: 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  for.  ** stateme
87f0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65  nt journals.  Ve
8800: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69  rify that this i
8810: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
8820: 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
8830: 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75   jfd == (useCksu
8840: 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  m ? pPager->jfd 
8850: 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20  : pPager->stfd) 
8860: 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  );...  rc = read
8870: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e  32bits(jfd, &pgn
8880: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
8890: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
88a0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
88b0: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26  te3OsRead(jfd, &
88c0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
88d0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
88e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
88f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
8900: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
8910: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
8920: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
8930: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
8940: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
8950: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
8960: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
8970: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
8980: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
8990: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
89a0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
89b0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
89c0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
89d0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
89e0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
89f0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
8a00: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
8a10: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
8a20: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
8a30: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
8a40: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
8a50: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
8a60: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
8a70: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
8a80: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
8a90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8aa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
8ab0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
8ac0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
8ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8ae0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
8af0: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
8b00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
8b10: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
8b20: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8b30: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
8b40: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
8b50: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
8b60: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  sum(pPager, pgno
8b70: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
8b80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8b90: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8ba0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
8bb0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8bc0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
8bd0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
8be0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
8bf0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
8c00: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
8c10: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
8c20: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
8c30: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
8c40: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
8c50: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
8c60: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
8c70: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
8c80: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
8c90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8ca0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
8cb0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
8cc0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
8cd0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
8ce0: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
8cf0: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
8d00: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
8d10: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
8d20: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
8d30: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
8d40: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
8d50: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
8d60: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
8d70: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
8d80: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
8d90: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
8da0: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
8db0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
8dc0: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
8dd0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
8de0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
8df0: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
8e00: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
8e10: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
8e20: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
8e30: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
8e40: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
8e50: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
8e60: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
8e70: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
8e80: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
8e90: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
8ea0: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
8eb0: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
8ec0: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
8ed0: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
8ee0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
8ef0: 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74  ontents are in t
8f00: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
8f10: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
8f20: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20  Otherwise, if a 
8f30: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63  full ROLLBACK oc
8f40: 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73  curs after the s
8f50: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f  tatement.  ** ro
8f60: 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20  llback the full 
8f70: 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f  ROLLBACK will no
8f80: 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61  t restore the pa
8f90: 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ge to its origin
8fa0: 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  al.  ** content.
8fb0: 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
8fc0: 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66   must be met bef
8fd0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
8fe0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
8ff0: 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
9000: 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
9010: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
9020: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
9030: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  riginal.  ** pag
9040: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20  e content is in 
9050: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
9060: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
9070: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
9080: 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72  in.  ** cache or
9090: 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b   else it is mark
90a0: 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
90b0: 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  0..  */.  pPg = 
90c0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
90d0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
90e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
90f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9100: 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29  SIVE || pPg!=0 )
9110: 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59  ;.  TRACE3("PLAY
9120: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c  BACK %d page %d\
9130: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
9140: 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  er), pgno);.  if
9150: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
9160: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9170: 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70   && (pPg==0 || p
9180: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29  Pg->needSync==0)
9190: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
91a0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
91b0: 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
91c0: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
91d0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
91e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
91f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9200: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9210: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
9220: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9230: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
9240: 50 67 20 29 20 70 50 67 2d 3e 64 69 72 74 79 20  Pg ) pPg->dirty 
9250: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
9260: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
9270: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
9280: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
9290: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
92a0: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
92b0: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
92c0: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
92d0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
92e0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
92f0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
9300: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
9310: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
9320: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
9330: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
9340: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
9350: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
9360: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
9370: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
9380: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
9390: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
93a0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
93b0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f  id *pData;.    /
93c0: 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e  * assert( pPg->n
93d0: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
93e0: 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  gno==1 ); */.   
93f0: 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54   pData = PGHDR_T
9400: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20  O_DATA(pPg);.   
9410: 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61   memcpy(pData, a
9420: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9430: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
9440: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
9450: 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49  ctor ){  /*** FI
9460: 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68  X ME:  Should th
9470: 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a  is be xReinit? *
9480: 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72  **/.      pPager
9490: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
94a0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
94b0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69  eSize);.    }.#i
94c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
94d0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
94e0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
94f0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
9500: 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45  .#endif.    CODE
9510: 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
9520: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
9530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
9550: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
9560: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
9570: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9580: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
9590: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
95a0: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
95b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
95c0: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
95d0: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
95e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
95f0: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
9600: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
9610: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9620: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
9630: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
9640: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  is..**.** The ma
9650: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9660: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
9670: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
9680: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
9690: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
96a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
96b0: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
96c0: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
96d0: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
96e0: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
96f0: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
9700: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
9710: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
9720: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
9730: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
9740: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
9750: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
9760: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9770: 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20  delmaster(const 
9780: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
9790: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
97a0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
97b0: 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65  .  OsFile *maste
97c0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
97d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
97e0: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
97f0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
9800: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
9810: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
9820: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9830: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9840: 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65  ile */..  /* Ope
9850: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
9860: 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73  rnal file exclus
9870: 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f  ively in case so
9880: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
9890: 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67  .  ** is running
98a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
98b0: 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20  so. Not that it 
98c0: 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64  makes too much d
98d0: 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
98e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
98f0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61  OpenReadOnly(zMa
9900: 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a  ster, &master);.
9910: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9920: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
9930: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
9940: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
9950: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
9960: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
9970: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9980: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9990: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
99a0: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
99b0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
99c0: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
99d0: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
99e0: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
99f0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
9a00: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
9a10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
9a20: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
9a30: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
9a40: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
9a50: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
9a60: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
9a70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
9a80: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
9a90: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
9aa0: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
9ab0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
9ac0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
9ad0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9ae0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
9af0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9b00: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
9b10: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
9b20: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
9b30: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
9b40: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
9b50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9b60: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9b70: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
9b80: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
9b90: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
9ba0: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
9bb0: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
9bc0: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
9bd0: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
9be0: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
9bf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9c00: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
9c10: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
9c20: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
9c30: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
9c40: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
9c50: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
9c60: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
9c70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
9c80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
9c90: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
9ca0: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
9cb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9cc0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9cd0: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
9ce0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
9cf0: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
9d00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
9d10: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
9d20: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
9d30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
9d40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9d50: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
9d60: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9d70: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
9d80: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
9d90: 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26  urnal(journal, &
9da0: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
9db0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
9dc0: 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(&journal);. 
9dd0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
9de0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9df0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9e00: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9e10: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
9e20: 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26   zMasterPtr!=0 &
9e30: 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
9e40: 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
9e50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9e60: 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29  Free(zMasterPtr)
9e70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20  ;.        if( c 
9e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9e90: 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e  We have a match.
9ea0: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
9eb0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9ec0: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
9ed0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9ee0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9ef0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
9f00: 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74   zJournal += (st
9f10: 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  rlen(zJournal)+1
9f20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
9f30: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
9f40: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c  e(zMaster);..del
9f50: 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
9f60: 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
9f70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
9f80: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
9f90: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
9fa0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
9fb0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9fc0: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(&master);.  }.
9fd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9fe0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79  /*.** Make every
9ff0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
a000: 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68  he agree with wh
a010: 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20  at is on disk.  
a020: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a  In other words,.
a030: 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69  ** reread the di
a040: 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  sk to reset the 
a050: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63  state of the cac
a060: 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  he..**.** This r
a070: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a080: 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63   after a rollbac
a090: 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20  k in which some 
a0a0: 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63  of the dirty cac
a0b0: 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20  he.** pages had 
a0c0: 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
a0d0: 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20  en out to disk. 
a0e0: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
a0f0: 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63   back the.** cac
a100: 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  he content and t
a110: 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
a120: 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20  o do that is to 
a130: 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63  reread the old c
a140: 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66  ontent.** back f
a150: 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f  rom the disk..*/
a160: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
a170: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50  r_reload_cache(P
a180: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
a190: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
a1a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
a1b0: 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  K;.  for(pPg=pPa
a1c0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
a1d0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
a1e0: 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  l){.    char zBu
a1f0: 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  f[SQLITE_MAX_PAG
a200: 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28  E_SIZE];.    if(
a210: 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63   !pPg->dirty ) c
a220: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
a230: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
a240: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
a250: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  bSize ){.      r
a260: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
a270: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  k(pPager->fd, pP
a280: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
a290: 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
a2a0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
a2b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a2c0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a2d0: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
a2e0: 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
a2f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
a310: 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20  CE3("REFETCH %d 
a320: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
a330: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
a340: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
a350: 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
a360: 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
a370: 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67  r, zBuf, pPg->pg
a380: 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73  no, 2);.    }els
a390: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
a3a0: 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d  zBuf, 0, pPager-
a3b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a3c0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
a3d0: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
a3e0: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
a3f0: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
a400: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
a410: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
a420: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a430: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
a440: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
a450: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
a460: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
a470: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a480: 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
a490: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
a4a0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
a4b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
a4c0: 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
a4d0: 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
a4e0: 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
a4f0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra);.      }. 
a500: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65     }.    pPg->ne
a510: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
a520: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
a530: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
a540: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
a550: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
a560: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
a570: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
a580: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
a590: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
a5a0: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
a5b0: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
a5c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
a5d0: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
a5e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a5f0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
a600: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
a610: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  nt nPage){.  ass
a620: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
a630: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
a640: 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  IVE );.  return 
a650: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a660: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
a670: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
a680: 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f  i64)nPage);.}../
a690: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
a6a0: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
a6b0: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
a6c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
a6d0: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
a6e0: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
a6f0: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
a700: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
a710: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
a720: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
a730: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
a740: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
a750: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
a760: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
a770: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
a780: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
a790: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
a7a0: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
a7b0: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
a7c0: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
a7d0: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
a7e0: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
a7f0: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
a800: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
a810: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
a820: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
a830: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
a840: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
a850: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
a860: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
a870: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
a880: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
a890: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
a8a0: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
a8b0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
a8c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
a8d0: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
a8e0: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
a8f0: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
a900: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
a910: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
a920: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
a930: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
a940: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
a950: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
a960: 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
a970: 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
a980: 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
a990: 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
a9a0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
a9b0: 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73  **  (6)  N bytes
a9c0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
a9d0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
a9e0: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
a9f0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
aa00: 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
aa10: 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
aa20: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
aa30: 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
aa40: 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
aa50: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
aa60: 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
aa70: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
aa90: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
aaa0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
aab0: 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
aac0: 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f  .**  (7)  Zero o
aad0: 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
aae0: 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
aaf0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
ab00: 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
ab10: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
ab20: 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
ab30: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
ab40: 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
ab50: 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
ab60: 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
ab70: 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
ab80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
ab90: 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
aba0: 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   6 items above..
abb0: 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
abc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
abd0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
abe0: 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 7th item..**.
abf0: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
ac00: 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
ac10: 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
ac20: 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
ac30: 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
ac40: 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
ac50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
ac60: 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
ac70: 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
ac80: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
ac90: 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
aca0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
acb0: 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
acc0: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
acd0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
ace0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
acf0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
ad00: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
ad10: 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
ad20: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
ad30: 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
ad40: 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
ad50: 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
ad60: 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
ad70: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
ad80: 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
ad90: 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
ada0: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
adb0: 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
adc0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
add0: 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
ade0: 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
adf0: 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
ae00: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
ae10: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
ae20: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
ae30: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
ae40: 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
ae50: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
ae60: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
ae70: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
ae80: 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
ae90: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
aea0: 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
aeb0: 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
aec0: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
aed0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
aee0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
aef0: 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
af00: 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
af10: 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
af20: 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
af30: 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
af40: 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
af50: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
af60: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
af70: 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
af80: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
af90: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
afa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
afb0: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
afc0: 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
afd0: 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
afe0: 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
aff0: 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
b000: 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
b010: 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
b020: 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
b030: 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
b040: 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
b050: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
b060: 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
b070: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
b080: 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
b090: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
b0a0: 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
b0b0: 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
b0c0: 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
b0d0: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
b0e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
b0f0: 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
b100: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
b110: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
b120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b130: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
b140: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b150: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
b160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b170: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b180: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
b190: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b1b0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
b1c0: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
b1d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b1f0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b200: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
b210: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
b220: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
b230: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
b240: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
b270: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
b280: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
b290: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
b2a0: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
b2b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
b2c0: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
b2d0: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
b2e0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
b2f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
b300: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
b310: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
b320: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
b330: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
b340: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
b350: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
b360: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
b370: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
b380: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b390: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
b3a0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
b3b0: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
b3c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
b3d0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b3e0: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
b3f0: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
b400: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b410: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
b420: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
b430: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
b440: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
b450: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
b460: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
b470: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
b480: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
b490: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
b4a0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
b4b0: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
b4c0: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
b4d0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
b4e0: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
b4f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
b500: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
b510: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
b520: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
b530: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
b540: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
b550: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
b560: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
b570: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b580: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
b590: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
b5a0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
b5b0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
b5c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b5d0: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
b5e0: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
b5f0: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
b600: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
b610: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
b620: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
b630: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
b640: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
b650: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
b660: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
b670: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
b680: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
b690: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
b6a0: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
b6b0: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
b6c0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
b6d0: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
b6e0: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
b6f0: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
b700: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
b710: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
b720: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
b730: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
b740: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
b750: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
b760: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
b770: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
b780: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
b790: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
b7a0: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
b7b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b7c0: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
b7d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
b7e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
b7f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b800: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
b810: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
b820: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
b830: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
b840: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
b850: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
b860: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
b870: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
b880: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
b890: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
b8a0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
b8b0: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
b8c0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
b8d0: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
b8e0: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
b8f0: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
b900: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
b910: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
b920: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
b930: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b940: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
b950: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
b960: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b970: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
b980: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
b990: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
b9a0: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
b9b0: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
b9c0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
b9d0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
b9e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
b9f0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
ba00: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
ba10: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
ba20: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
ba30: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
ba40: 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  t's original siz
ba50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
ba60: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
ba70: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
ba80: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
ba90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
baa0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
bab0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
bac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bad0: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c  >origDbSize==0 |
bae0: 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  | pPager->origDb
baf0: 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20  Size==mxPg );.  
bb00: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
bb10: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
bb20: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
bb30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bb40: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
bb50: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
bb60: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
bb70: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
bb80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bb90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
bba0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
bbb0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
bbc0: 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20  Pager)); */.    
bbd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bbe0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  K ) goto end_pla
bbf0: 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a  yback;.  .    /*
bc00: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
bc10: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
bc20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
bc30: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
bc40: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
bc50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
bc60: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
bc70: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
bc80: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
bc90: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
bca0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
bcb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bcc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
bcd0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
bce0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
bcf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
bd00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
bd10: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
bd20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
bd40: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
bd50: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
bd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bd70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61    }.  }..  /* Pa
bd80: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ges that have be
bd90: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
bda0: 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65  e journal but ne
bdb0: 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  ver synced.  ** 
bdc0: 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72  where not restor
bdd0: 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61  ed by the loop a
bde0: 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74  bove.  We have t
bdf0: 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a  o restore those.
be00: 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65    ** pages by re
be10: 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20  ading them back 
be20: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
be30: 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  l database..  */
be40: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
be50: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61  QLITE_OK );.  pa
be60: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
be70: 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70  (pPager);..end_p
be80: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
be90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bea0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
beb0: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
bec0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
bed0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
bee0: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
bef0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
bf00: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
bf10: 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c  ill return true,
bf20: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
bf30: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
bf40: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
bf50: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
bf60: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
bf70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bf80: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
bf90: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
bfa0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
bfb0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
bfc0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
bfd0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
bfe0: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
bff0: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
c000: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
c010: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
c020: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
c030: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
c040: 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54  erent PAGER_SECT
c050: 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c  OR_SIZE.  ** val
c060: 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
c070: 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
c080: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
c090: 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ss..  */.  pPage
c0a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
c0b0: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
c0c0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  E;.  return rc;.
c0d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
c0e0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
c0f0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
c100: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
c110: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
c120: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
c130: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
c140: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
c150: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
c160: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
c170: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
c180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
c190: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
c1a0: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
c1b0: 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
c1c0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
c1d0: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
c1e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
c1f0: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
c200: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
c210: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
c220: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
c230: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c240: 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
c250: 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
c260: 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
c270: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
c280: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
c290: 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
c2a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
c2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c2c0: 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
c2d0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
c2e0: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c300: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
c310: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
c320: 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
c330: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
c340: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c350: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
c360: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c380: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
c390: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
c3a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c3b0: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
c3c0: 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
c3d0: 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
c3e0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
c3f0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
c400: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
c410: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c420: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c430: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
c440: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
c450: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
c460: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
c470: 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73  fset to the firs
c480: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c490: 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68   written.  ** th
c4a0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
c4b0: 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65  nsaction, or the
c4c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c4d0: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
c4e0: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
c4f0: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
c500: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
c510: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
c520: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
c530: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
c540: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
c550: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
c560: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20   = szJ;.  }.  . 
c570: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
c580: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
c590: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
c5a0: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ize..  */.  if( 
c5b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
c5c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
c5d0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c5e0: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
c5f0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
c600: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c610: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
c620: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
c630: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
c640: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
c650: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
c660: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
c670: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
c680: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
c690: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
c6a0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
c6b0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
c6c0: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
c6d0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
c6e0: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
c6f0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
c700: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
c710: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
c720: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
c730: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
c740: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
c750: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c760: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
c770: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
c780: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
c790: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
c7a0: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
c7b0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
c7c0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
c7d0: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
c7e0: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
c7f0: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
c800: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
c810: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
c820: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
c830: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
c840: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
c850: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c860: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
c870: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
c880: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72  .  }..  /* Now r
c890: 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62  oll some pages b
c8a0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61  ack from the tra
c8b0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c8c0: 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a  . Pager.stmtJSiz
c8d0: 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73  e.  ** was the s
c8e0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
c8f0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  al file when thi
c900: 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  s statement was 
c910: 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a  started, so.  **
c920: 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65   everything afte
c930: 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  r that needs to 
c940: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  be rolled back, 
c950: 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a  either into the.
c960: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
c970: 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c  he memory cache,
c980: 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
c990: 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   ** If it is not
c9a0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65   zero, then Page
c9b0: 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20  r.stmtHdrOff is 
c9c0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c9d0: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
c9e0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
c9f0: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
ca00: 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61   during this sta
ca10: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ca20: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
ca30: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
ca40: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
ca50: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
ca60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ca70: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
ca80: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
ca90: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
caa0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
cab0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
cac0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
cad0: 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
cae0: 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72  mtCksum;.  asser
caf0: 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  t( JOURNAL_HDR_S
cb00: 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67 65  Z(pPager)<(pPage
cb10: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29  r->pageSize+8) )
cb20: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
cb30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d  r->journalOff <=
cb40: 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72   (hdrOff-(pPager
cb50: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29  ->pageSize+8)) )
cb60: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
cb70: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
cb80: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
cb90: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
cba0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
cbb0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
cbc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cbd0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
cbe0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
cbf0: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
cc00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
cc10: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
cc20: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
cc30: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
cc40: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
cc50: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
cc60: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
cc70: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
cc80: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
cc90: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
cca0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ccb0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
ccc0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
ccd0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
cce0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
ccf0: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
cd00: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
cd10: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
cd20: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
cd30: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
cd40: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
cd50: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
cd60: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
cd70: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
cd80: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
cd90: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
cda0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
cdb0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
cdc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
cdd0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cde0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
cdf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
ce00: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
ce10: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
ce20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ce30: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
ce40: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
ce50: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
ce60: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
ce70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ce80: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
ce90: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
cea0: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
ceb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cec0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
ced0: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
cee0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
cef0: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
cf00: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
cf10: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61  ite3pager_set_ca
cf20: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
cf30: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
cf40: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
cf50: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
cf60: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
cf70: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
cf80: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
cf90: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
cfa0: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
cfb0: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
cfc0: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
cfd0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
cfe0: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
cff0: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
d000: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
d010: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
d020: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
d030: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d040: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
d050: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
d060: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
d070: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
d080: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
d090: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
d0a0: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
d0b0: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
d0c0: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
d0d0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
d0e0: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
d0f0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d100: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
d110: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
d120: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d130: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d140: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
d150: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
d160: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
d170: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
d180: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
d190: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
d1a0: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
d1b0: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
d1c0: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
d1d0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
d1e0: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
d1f0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
d200: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
d210: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
d220: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
d230: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
d240: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
d250: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
d260: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
d270: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
d280: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
d290: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
d2a0: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
d2b0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d2c0: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
d2d0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
d2e0: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
d2f0: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
d300: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
d310: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
d320: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
d330: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
d350: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
d360: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
d370: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
d380: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
d390: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
d3a0: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
d3b0: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
d3c0: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
d3d0: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
d3e0: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
d3f0: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
d400: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d410: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
d420: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
d430: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
d440: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
d450: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
d460: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d470: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
d480: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
d490: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
d4a0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
d4b0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
d4c0: 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
d4d0: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
d4e0: 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a  ty_level(Pager *
d4f0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
d500: 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  l){.  pPager->no
d510: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
d520: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
d530: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
d540: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
d550: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
d560: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
d570: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d580: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d590: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
d5a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
d5b0: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
d5c0: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
d5d0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
d5e0: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
d5f0: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
d600: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
d610: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
d620: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
d630: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
d640: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
d650: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
d660: 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
d670: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
d680: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57  mporary file.  W
d690: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
d6a0: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a   the file into z
d6b0: 46 69 6c 65 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d  File.** (zFile m
d6c0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
d6d0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
d6e0: 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e  SIZE bytes long.
d6f0: 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  )  Write.** the 
d700: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d710: 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
d720: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d730: 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
d740: 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
d750: 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a  de if we fail..*
d760: 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c  *.** The OS will
d770: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
d780: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
d790: 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
d7a0: 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a   is.** closed..*
d7b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
d7c0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
d7d0: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
d7e0: 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20  OsFile **pFd){. 
d7f0: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
d800: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
d810: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
d820: 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
d830: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
d840: 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20  lysis only */.  
d850: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
d860: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
d870: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
d880: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d890: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
d8a0: 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b  (zFile, pFd, 1);
d8b0: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
d8c0: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
d8d0: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
d8e0: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
d8f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
d900: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
d910: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
d920: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d930: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
d940: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
d950: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
d960: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
d970: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
d980: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
d990: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
d9a0: 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
d9b0: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
d9c0: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
d9d0: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
d9e0: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
d9f0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67  using sqlite3pag
da00: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  er_unref()..**.*
da10: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
da20: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
da30: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
da40: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
da50: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
da60: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
da70: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
da80: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
da90: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
daa0: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
dab0: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
dac0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
dad0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
dae0: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
daf0: 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
db00: 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
db10: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
db20: 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
db30: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
db40: 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
db50: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
db60: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
db70: 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a  open(.  Pager **
db80: 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
db90: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
dba0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
dbb0: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
dbc0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
dbd0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
dbe0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
dbf0: 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
dc00: 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
dc10: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
dc20: 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
dc30: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
dc40: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
dc70: 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
dc80: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
dc90: 61 67 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  ager = 0;.  char
dca0: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
dcb0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c  = 0;.  int nameL
dcc0: 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  en;  /* Compiler
dcd0: 20 69 73 20 77 72 6f 6e 67 2e 20 54 68 69 73 20   is wrong. This 
dce0: 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
dcf0: 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65  lized before use
dd00: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64   */.  OsFile *fd
dd10: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
dd20: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
dd30: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
dd40: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
dd50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
dd60: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
dd70: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
dd80: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
dd90: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
dda0: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
ddb0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
ddc0: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
ddd0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
dde0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
ddf0: 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ZE];.#ifdef SQLI
de00: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
de10: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
de20: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
de30: 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
de40: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
de50: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
de60: 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
de70: 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
de80: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
de90: 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
dea0: 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
deb0: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
dec0: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
ded0: 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
dee0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
def0: 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
df00: 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
df10: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
df20: 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75  n be set. It wou
df30: 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73  ld be nice to as
df40: 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54  sert.  ** that T
df50: 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
df60: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75   is non-zero, bu
df70: 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61  t alas this brea
df80: 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20  ks test cases . 
df90: 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69   ** written to i
dfa0: 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20  nvoke the pager 
dfb0: 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  directly..  */. 
dfc0: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
dfd0: 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
dfe0: 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
dff0: 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69  t( pTsd );.#endi
e000: 66 0a 0a 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f  f..  /* If mallo
e010: 63 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  c() has already 
e020: 66 61 69 6c 65 64 20 72 65 74 75 72 6e 20 53 51  failed return SQ
e030: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f  LITE_NOMEM. Befo
e040: 72 65 20 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73  re even.  ** tes
e050: 74 69 6e 67 20 66 6f 72 20 74 68 69 73 2c 20 73  ting for this, s
e060: 65 74 20 2a 70 70 50 61 67 65 72 20 74 6f 20 4e  et *ppPager to N
e070: 55 4c 4c 20 73 6f 20 74 68 65 20 63 61 6c 6c 65  ULL so the calle
e080: 72 20 6b 6e 6f 77 73 20 74 68 65 20 70 61 67 65  r knows the page
e090: 72 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  r.  ** structure
e0a0: 20 77 61 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63   was never alloc
e0b0: 61 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70  ated. .  */.  *p
e0c0: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66  pPager = 0;.  if
e0d0: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
e0e0: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72  ailed() ){.    r
e0f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e100: 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
e110: 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&fd, 0, sizeof(
e120: 66 64 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  fd));..  /* Open
e130: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
e140: 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74  and set zFullPat
e150: 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61  hname to point a
e160: 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20  t malloc()ed .  
e170: 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69  ** memory contai
e180: 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74  ning the complet
e190: 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e  e filename (i.e.
e1a0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64   including the d
e1b0: 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a  irectory)..  */.
e1c0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
e1d0: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
e1e0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
e1f0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
e200: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
e210: 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
e220: 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
e230: 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
e240: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
e250: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 22  = sqliteStrDup("
e260: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  ");.    }else.#e
e270: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
e280: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
e290: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
e2a0: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
e2b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  );.      if( zFu
e2c0: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
e2d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e2e0: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
e2f0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  e(zFullPathname,
e300: 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29   &fd, &readOnly)
e310: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
e330: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  = sqlite3pager_o
e340: 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
e350: 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  fd);.    zFilena
e360: 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  me = zTemp;.    
e370: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e380: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
e390: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
e3a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
e3b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e3c0: 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
e3d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
e3e0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
e3f0: 72 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20  r structure. As 
e400: 70 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65  part of the same
e410: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c   allocation, all
e420: 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65  ocate.  ** space
e430: 20 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61   for the full pa
e440: 74 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c  ths of the file,
e450: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a   directory and j
e460: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61  ournal .  ** (Pa
e470: 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50  ger.zFilename, P
e480: 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20  ager.zDirectory 
e490: 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
e4a0: 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  al)..  */.  if( 
e4b0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
e4c0: 0a 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73  .    nameLen = s
e4d0: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
e4e0: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ame);.    pPager
e4f0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
e500: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
e510: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33   + nameLen*3 + 3
e520: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
e530: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e540: 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
e550: 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
e560: 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72  , free the memor
e570: 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  y .  ** pointed 
e580: 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e  to by zFullPathn
e590: 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50 61  ame, free the Pa
e5a0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
e5b0: 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a  d close the .  *
e5c0: 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68  * file. Since th
e5d0: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
e5e0: 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
e5f0: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
e600: 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
e610: 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
e620: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
e630: 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c  pPager || !zFull
e640: 50 61 74 68 6e 61 6d 65 20 7c 7c 20 72 63 21 3d  Pathname || rc!=
e650: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e660: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
e670: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
e680: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
e690: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
e6a0: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
e6b0: 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51   return ((rc==SQ
e6c0: 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f  LITE_OK)?SQLITE_
e6d0: 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a  NOMEM:rc);.  }..
e6e0: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25    TRACE3("OPEN %
e6f0: 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
e700: 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c  DLEID(fd), zFull
e710: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
e720: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
e730: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
e740: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  1];.  pPager->zD
e750: 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
e760: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
e770: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67  meLen+1];.  pPag
e780: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
e790: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e7a0: 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  ry[nameLen+1];. 
e7b0: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
e7c0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
e7d0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
e7e0: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
e7f0: 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74  ectory, zFullPat
e800: 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69  hname);..  for(i
e810: 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26  =nameLen; i>0 &&
e820: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e830: 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
e840: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
e850: 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
e860: 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20  tory[i-1] = 0;. 
e870: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
e880: 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50  zJournal, zFullP
e890: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  athname);.  sqli
e8a0: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
e8b0: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
e8c0: 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
e8d0: 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
e8e0: 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65  urnal");.  pPage
e8f0: 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a  r->fd = fd;.  /*
e900: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e910: 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Open = 0; */.  p
e920: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
e930: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
e940: 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
e950: 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
e960: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
e970: 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
e980: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
e990: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
e9a0: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
e9b0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
e9c0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
e9d0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
e9e0: 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
e9f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
ea00: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
ea10: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  PAGE_SIZE;.  /* 
ea20: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
ea30: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
ea40: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
ea50: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
ea60: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
ea70: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
ea80: 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f  nMaxPage = 0; */
ea90: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
eaa0: 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72  e = 100;.  asser
eab0: 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d  t( PAGER_UNLOCK=
eac0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  =0 );.  /* pPage
ead0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
eae0: 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a  _UNLOCK; */.  /*
eaf0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
eb00: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
eb10: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
eb20: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
eb30: 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
eb40: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
eb50: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
eb60: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
eb70: 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
eb80: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
eb90: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
eba0: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
ebb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
ebc0: 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
ebd0: 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f  noSync?0:1);.  /
ebe0: 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
ebf0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
ec00: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
ec10: 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
ec20: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
ec30: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
ec40: 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
ec50: 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
ec60: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  ;.  pPager->sect
ec70: 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53  orSize = PAGER_S
ec80: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a  ECTOR_SIZE;.  /*
ec90: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
eca0: 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
ecb0: 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
ecc0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
ecd0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
ece0: 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
ecf0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
ed00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ed10: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
ed20: 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  NT.  pPager->pNe
ed30: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
ed40: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
ed50: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
ed60: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
ed70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ed80: 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
ed90: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
eda0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
edb0: 67 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64  ger_set_busyhand
edc0: 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ler(Pager *pPage
edd0: 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r, BusyHandler *
ede0: 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20  pBusyHandler){. 
edf0: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
ee00: 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e  ndler = pBusyHan
ee10: 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  dler;.}../*.** S
ee20: 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
ee30: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
ee40: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
ee50: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
ee60: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
ee70: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
ee80: 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
ee90: 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
eea0: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
eeb0: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
eec0: 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
eed0: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
eee0: 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
eef0: 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
ef00: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
ef10: 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
ef20: 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
ef30: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
ef40: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
ef50: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
ef60: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
ef70: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
ef80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ef90: 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72  3pager_set_destr
efa0: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
efb0: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
efc0: 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  c)(void*,int)){.
efd0: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
efe0: 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
eff0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f000: 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
f010: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
f020: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
f030: 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
f040: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
f050: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
f060: 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
f070: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
f080: 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
f090: 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
f0a0: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
f0b0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
f0c0: 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
f0d0: 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
f0e0: 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
f0f0: 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
f100: 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
f110: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
f120: 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
f130: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
f140: 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50  r_set_reiniter(P
f150: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
f160: 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f  id (*xReinit)(vo
f170: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
f180: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
f190: 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
f1a0: 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
f1b0: 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68  size.  Return th
f1c0: 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20  e new size.  If 
f1d0: 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20  the suggest new 
f1e0: 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20  page.** size is 
f1f0: 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74  inappropriate, t
f200: 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  hen an alternati
f210: 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ve page size is 
f220: 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20  selected.** and 
f230: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
f240: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
f250: 74 5f 70 61 67 65 73 69 7a 65 28 50 61 67 65 72  t_pagesize(Pager
f260: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61   *pPager, int pa
f270: 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  geSize){.  asser
f280: 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t( pageSize>=512
f290: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
f2a0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
f2b0: 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ZE );.  if( !pPa
f2c0: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
f2d0: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
f2e0: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
f2f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
f300: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  er->pageSize;.}.
f310: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
f320: 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
f330: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
f340: 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
f350: 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
f360: 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
f370: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
f380: 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
f390: 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
f3a0: 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
f3b0: 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
f3c0: 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
f3d0: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
f3e0: 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
f3f0: 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
f400: 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
f410: 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
f420: 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
f430: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
f440: 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
f450: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f460: 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
f470: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
f480: 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
f490: 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
f4a0: 0a 76 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d 75  .void clear_simu
f4b0: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29  lated_io_error()
f4c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
f4d0: 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a  rror_hit = 0;.}.
f4e0: 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
f4f0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
f500: 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
f510: 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
f520: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
f530: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
f540: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
f550: 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
f560: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f570: 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
f580: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
f590: 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
f5a0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
f5b0: 6e 65 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74  ne clear_simulat
f5c0: 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20  ed_io_error().# 
f5d0: 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
f5e0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f5f0: 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
f600: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
f610: 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
f620: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
f630: 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
f640: 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
f650: 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
f660: 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
f670: 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
f680: 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
f690: 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
f6a0: 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
f6b0: 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
f6c0: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
f6d0: 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
f6e0: 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
f6f0: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
f700: 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
f710: 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
f720: 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
f730: 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
f740: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
f750: 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
f760: 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
f770: 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
f780: 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
f790: 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
f7a0: 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
f7b0: 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
f7c0: 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
f7d0: 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
f7e0: 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
f7f0: 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
f800: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
f810: 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65  r_read_fileheade
f820: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
f830: 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
f840: 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
f850: 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
f860: 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  , N);.  if( MEMD
f870: 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61  B==0 ){.    disa
f880: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f890: 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
f8a0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
f8b0: 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
f8c0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
f8d0: 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
f8e0: 2c 20 4e 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  , N);.    enable
f8f0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f900: 72 6f 72 73 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rors();.  }.}../
f910: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f920: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
f930: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
f940: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
f950: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
f960: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
f970: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
f980: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
f990: 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
f9a0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
f9b0: 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
f9c0: 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
f9d0: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
f9e0: 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
f9f0: 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
fa00: 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
fa10: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
fa20: 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
fa30: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
fa40: 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
fa50: 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
fa60: 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
fa70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fa80: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
fa90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
faa0: 20 20 69 36 34 20 6e 3b 0a 20 20 61 73 73 65 72    i64 n;.  asser
fab0: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
fac0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
fad0: 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e  Size>=0 ){.    n
fae0: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
faf0: 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
fb00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
fb10: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
fb20: 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f  fd, &n)!=SQLITE_
fb30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
fb40: 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
fb50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
fb60: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
fb70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
fb80: 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
fb90: 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
fba0: 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
fbb0: 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
fbc0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
fbd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
fbe0: 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
fbf0: 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
fc00: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
fc10: 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
fc20: 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
fc30: 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
fc40: 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
fc50: 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n++;.  }.  retur
fc60: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  n n;.}../*.** Fo
fc70: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
fc80: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
fc90: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
fca0: 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  r*);.../*.** Unl
fcb0: 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
fcc0: 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
fcd0: 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
fce0: 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
fcf0: 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
fd00: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
fd10: 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
fd20: 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
fd30: 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
fd40: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
fd50: 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20  ager_movepage() 
fd60: 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76  routine can leav
fd70: 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  e a page in the 
fd80: 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50  .** pNextFree/pP
fd90: 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61  revFree list tha
fda0: 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20  t is not a part 
fdb0: 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69  of any hash-chai
fdc0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
fdd0: 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69  d unlinkHashChai
fde0: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
fdf0: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
fe00: 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30  if( pPg->pgno==0
fe10: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
fe20: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
fe30: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
fe40: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
fe50: 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
fe60: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
fe70: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
fe80: 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
fe90: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
fea0: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
feb0: 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
fec0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
fed0: 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
fee0: 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
fef0: 5b 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d  [pager_hash(pPg-
ff00: 3e 70 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a  >pgno)]!=pPg );.
ff10: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
ff20: 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
ff30: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
ff40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
ff50: 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
ff60: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
ff70: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ff80: 61 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b  aHash[h]==pPg );
ff90: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
ffa0: 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
ffb0: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 0a 20 20 70  xtHash;.  }..  p
ffc0: 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
ffd0: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
ffe0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
fff0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  = 0;.}../*.** Un
10000 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d  link a page from
10010 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28   the free list (
10020 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
10030 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
10040 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d  ==0).** and from
10050 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73   its hash collis
10060 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ion chain..*/.st
10070 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
10080 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
10090 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
100a0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
100b0 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20  ..  /* Keep the 
100c0 70 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69  pFirstSynced poi
100d0 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74  nter pointing at
100e0 20 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68   the first synch
100f0 72 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a  ronized page */.
10100 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
10110 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
10120 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
10130 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10140 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26  ;.    while( p &
10150 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
10160 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
10170 65 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d  e; }.    pPager-
10180 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
10190 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  p;.  }..  /* Unl
101a0 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ink from the fre
101b0 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70  elist */.  if( p
101c0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
101d0 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
101e0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
101f0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
10200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
10210 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
10220 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irst==pPg );.   
10230 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
10240 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10250 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10260 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
10270 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
10280 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
10290 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
102a0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
102b0 74 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  t( pPager->pLast
102c0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
102d0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
102e0 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
102f0 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  .  pPg->pNextFre
10300 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
10310 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e  ee = 0;..  /* Un
10320 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67  link from the pg
10330 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  no hash table */
10340 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
10350 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
10360 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10370 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10380 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10390 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
103a0 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65  runcate an in-me
103b0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
103c0 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61  Delete.** all pa
103d0 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
103e0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
103f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
10400 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
10410 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  ..** Referenced 
10420 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
10430 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
10440 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a   are zeroed..*/.
10450 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f  static void memo
10460 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  ryTruncate(Pager
10470 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
10480 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72  dr *pPg;.  PgHdr
10490 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64   **ppPg;.  int d
104a0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
104b0 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20  dbSize;..  ppPg 
104c0 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  = &pPager->pAll;
104d0 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
104e0 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20   *ppPg)!=0 ){.  
104f0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
10500 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  =dbSize ){.     
10510 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
10520 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
10530 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e  e if( pPg->nRef>
10540 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
10550 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
10560 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
10570 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
10580 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
10590 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
105a0 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20  se{.      *ppPg 
105b0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
105c0 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
105d0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  e(pPg);.      sq
105e0 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
105f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
10600 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
10610 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
10620 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
10630 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
10640 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
10650 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
10660 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
10670 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
10680 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
10690 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
106a0 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
106b0 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
106c0 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
106d0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
106e0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
106f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
10700 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
10710 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
10720 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
10730 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
10740 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
10750 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
10760 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
10770 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
10780 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
10790 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
107a0 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
107b0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
107c0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
107d0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
107e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
107f0 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
10800 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
10810 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
10820 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
10830 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10840 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
10850 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
10860 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
10870 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
10880 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
10890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
108a0 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f  Y && sqlite3Invo
108b0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  keBusyHandler(pP
108c0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
108d0 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  er) );.    if( r
108e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
108f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
10900 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ate = locktype;.
10910 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10930 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
10940 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
10950 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
10960 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
10970 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
10980 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10990 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
109a0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
109b0 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
109c0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
109d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
109e0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
109f0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
10a00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10a10 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
10a20 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
10a30 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
10a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10a50 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
10a60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
10a70 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
10a80 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
10a90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
10aa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10ab0 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f   }.  rc = syncJo
10ac0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
10ad0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ae0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10af0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   rc;.  }..  /* G
10b00 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
10b10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
10b20 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e  base before trun
10b30 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  cating. */.  rc 
10b40 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
10b50 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
10b60 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
10b70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10b80 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10b90 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rc;.  }..  rc = 
10ba0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
10bb0 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
10bc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10bd0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
10be0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
10bf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10c00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
10c10 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
10c20 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
10c30 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
10c40 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
10c50 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
10c60 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
10c70 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
10c80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
10c90 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
10ca0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
10cb0 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
10cc0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
10cd0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
10ce0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
10cf0 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
10d00 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
10d10 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
10d20 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
10d30 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
10d40 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
10d50 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
10d60 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
10d70 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
10d80 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
10d90 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
10da0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10db0 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
10dc0 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
10dd0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
10de0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10df0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
10e00 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
10e10 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
10e20 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
10e30 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
10e40 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
10e50 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10e60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
10e70 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
10e80 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
10e90 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
10ea0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10eb0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
10ec0 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61  GEMENT.  /* A ma
10ed0 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61  lloc() cannot fa
10ee0 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72  il in sqlite3Thr
10ef0 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65  eadData() as one
10f00 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
10f10 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29  o .  ** malloc()
10f20 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
10f30 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20  dy been made by 
10f40 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f  this thread befo
10f50 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20  re it gets.  ** 
10f60 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54  to this point. T
10f70 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68  his means the Th
10f80 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61  readData must ha
10f90 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
10fa0 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73  d already.  ** s
10fb0 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  o that ThreadDat
10fc0 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20  a.nAlloc can be 
10fd0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65  set..  */.  Thre
10fe0 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
10ff0 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
11000 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ();.  assert( pP
11010 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
11020 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e  ( pTsd && pTsd->
11030 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66  nAlloc );.#endif
11040 0a 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 67  ..  switch( pPag
11050 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20  er->state ){.   
11060 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53 45   case PAGER_RESE
11070 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50  RVED:.    case P
11080 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20  AGER_SYNCED: .  
11090 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43    case PAGER_EXC
110a0 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20  LUSIVE: {.      
110b0 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e 79  /* We ignore any
110c0 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74 20   IO errors that 
110d0 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68 65  occur during the
110e0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20   rollback.      
110f0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f  ** operation. So
11100 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72 6f   disable IO erro
11110 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20  r simulation so 
11120 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20 20  that testing.   
11130 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65     ** works more
11140 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a   easily..      *
11150 2f 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f  /.      disable_
11160 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
11170 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 73 71 6c  ors();.      sql
11180 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
11190 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
111a0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
111b0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
111c0 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42        if( !MEMDB
111d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
111e0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
111f0 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
11200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11210 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11220 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65  errCode || pPage
11230 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
11240 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
11250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
11260 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b   PAGER_SHARED: {
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 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
112d0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
112e0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
112f0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
11300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
11310 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
11320 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
11330 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  t){.#ifndef NDEB
11340 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  UG.    if( MEMDB
11350 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
11360 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
11370 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
11380 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
11390 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
113a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
113b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
113c0 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
113d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
113e0 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
113f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e   }.#endif.    pN
11400 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
11410 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
11420 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
11430 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
11440 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
11450 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ger));.  assert(
11460 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11470 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
11480 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70  rnalOpen==0 && p
11490 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d  Pager->stmtOpen=
114a0 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  =0) );.  if( pPa
114b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
114c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
114d0 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
114e0 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
114f0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
11500 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  InJournal);.  if
11510 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
11520 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
11530 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
11540 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->stfd);.  }.  s
11550 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
11560 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
11570 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
11580 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
11590 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
115a0 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
115b0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
115c0 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
115d0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
115e0 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
115f0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
11600 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
11610 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
11620 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
11630 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65  r from the linke
11640 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73  d list of pagers
11650 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20   starting at .  
11660 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70 50  ** ThreadData.pP
11670 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  ager if memory-m
11680 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
11690 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bled..  */.  if(
116a0 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70   pPager==pTsd->p
116b0 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73  Pager ){.    pTs
116c0 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  d->pPager = pPag
116d0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  er->pNext;.  }el
116e0 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70  se{.    Pager *p
116f0 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d  Tmp;.    for(pTm
11700 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72  p = pTsd->pPager
11710 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70  ; pTmp->pNext!=p
11720 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70  Pager; pTmp=pTmp
11730 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 70 54  ->pNext);.    pT
11740 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67  mp->pNext = pPag
11750 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23  er->pNext;.  }.#
11760 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 46  endif..  sqliteF
11770 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
11780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
117a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
117b0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
117c0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
117d0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o sqlite3pager_p
117e0 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a  agenumber(void *
117f0 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
11800 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  *p = DATA_TO_PGH
11810 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
11820 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
11830 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
11840 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
11850 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
11860 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
11870 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
11880 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
11890 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
118a0 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
118b0 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
118c0 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
118d0 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
118e0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
118f0 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
11900 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
11910 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
11920 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
11930 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
11940 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
11950 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
11960 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
11970 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
11980 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
11990 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
119a0 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
119b0 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
119c0 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
119d0 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
119e0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
119f0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
11a00 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
11a10 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
11a20 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
11a30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
11a40 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
11a50 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
11a60 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
11a70 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
11a80 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
11a90 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
11aa0 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
11ab0 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
11ac0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
11ad0 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
11ae0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
11af0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
11b00 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
11b10 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
11b20 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
11b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
11b40 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
11b50 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
11b60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
11b70 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
11b80 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
11b90 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
11ba0 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
11bb0 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
11bc0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
11bd0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
11be0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
11bf0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
11c00 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
11c10 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
11c20 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
11c30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
11c40 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
11c50 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
11c60 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
11c70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
11c80 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
11c90 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
11ca0 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
11cb0 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f  +;.      REFINFO
11cc0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
11cd0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
11ce0 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
11cf0 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
11d00 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
11d10 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
11d20 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
11d30 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
11d40 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
11d50 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
11d60 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
11d70 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
11d80 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
11d90 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
11da0 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
11db0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
11dc0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
11dd0 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66  ata);.  page_ref
11de0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
11df0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11e00 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
11e10 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
11e20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
11e30 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
11e40 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
11e50 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
11e60 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
11e70 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
11e80 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
11e90 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
11ea0 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
11eb0 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
11ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
11ed0 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
11ee0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
11ef0 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
11f00 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
11f10 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
11f20 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
11f30 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
11f40 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
11f50 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
11f60 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
11f70 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
11f80 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
11f90 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
11fa0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
11fb0 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
11fc0 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
11fd0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
11fe0 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
11ff0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12000 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
12010 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
12020 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
12030 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
12040 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
12050 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
12060 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
12070 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12080 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
12090 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
120a0 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
120b0 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
120c0 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
120d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
120e0 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
120f0 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
12100 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
12110 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
12120 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
12130 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
12140 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
12150 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
12160 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
12170 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
12180 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
12190 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
121a0 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
121b0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
121c0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
121d0 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
121e0 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
121f0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
12200 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
12210 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
12220 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
12230 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
12240 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
12250 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
12260 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12270 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
12280 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
12290 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
122a0 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
122b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
122c0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
122d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
122e0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
122f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12300 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
12310 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
12320 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
12330 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
12340 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
12350 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
12360 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
12370 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
12380 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
12390 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
123a0 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
123b0 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
123c0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
123d0 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
123e0 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
123f0 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
12400 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
12410 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
12420 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
12430 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12440 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
12450 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
12460 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
12470 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
12480 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
12490 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
124a0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
124b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
124c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
124d0 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
124e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
124f0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
12500 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
12510 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
12520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
12530 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
12540 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
12550 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
12560 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
12570 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
12580 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
12590 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
125a0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
125b0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
125c0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
125d0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
125e0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
125f0 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
12600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
12610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
12620 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
12630 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
12640 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
12650 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
12660 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
12670 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
12680 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
12690 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
126a0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
126b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
126c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
126d0 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
126e0 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  jfd,.           
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12700 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
12710 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
12720 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
12730 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
12740 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
12750 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
12760 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
12770 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
12780 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
12790 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
127a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
127b0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
127c0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
127d0 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20  alOff);.        
127e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
127f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
12800 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a    TRACE2("SYNC j
12810 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
12820 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
12830 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12840 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
12850 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12860 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 20 20  >fullSync);.    
12870 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12880 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
12890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
128a0 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
128b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
128c0 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
128d0 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
128e0 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
128f0 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
12900 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
12910 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
12920 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
12930 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
12940 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
12950 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
12960 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
12970 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
12980 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
12990 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
129a0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
129b0 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
129c0 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
129d0 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
129e0 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
129f0 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
12a00 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
12a10 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
12a20 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
12a30 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
12a40 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
12a50 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
12a60 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
12a70 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
12a80 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
12a90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
12aa0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12ab0 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
12ac0 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
12ad0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
12ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
12af0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
12b00 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
12b10 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
12b20 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
12b30 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
12b40 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
12b50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12b60 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
12b70 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
12b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12b90 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
12ba0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
12bb0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
12bc0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
12bd0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
12be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12bf0 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
12c00 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
12c10 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
12c20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
12c30 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
12c40 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
12c50 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
12c60 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
12c70 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
12c80 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12c90 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
12ca0 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
12cb0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
12cc0 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
12cd0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
12ce0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
12cf0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
12d00 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
12d10 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
12d20 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
12d30 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
12d40 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
12d50 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
12d60 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
12d70 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
12d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
12d90 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
12da0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
12db0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
12dc0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
12dd0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
12de0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
12df0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
12e00 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
12e10 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
12e20 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
12e30 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
12e40 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
12e50 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
12e60 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
12e70 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
12e80 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
12e90 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
12ea0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
12eb0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
12ec0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
12ed0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
12ee0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
12ef0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
12f00 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
12f10 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
12f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12f30 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
12f40 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
12f50 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
12f60 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
12f70 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
12f80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
12f90 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
12fa0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
12fb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12fc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
12fd0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
12fe0 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
12ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
13000 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
13010 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
13020 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
13030 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
13040 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
13050 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
13060 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13070 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
13080 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
13090 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
130a0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
130b0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
130c0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
130d0 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
130e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
130f0 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
13100 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
13110 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
13120 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
13130 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
13140 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
13150 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
13160 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
13170 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
13180 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
13190 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
131a0 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  ){.      CODEC(p
131b0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
131c0 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
131d0 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
131e0 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f 52      TRACE3("STOR
131f0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
13200 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13210 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
13220 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13230 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
13240 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
13250 41 54 41 28 70 4c 69 73 74 29 2c 0a 20 20 20 20  ATA(pList),.    
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
13280 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13290 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
132a0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
132b0 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
132c0 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 45 53  o, 0);.      TES
132d0 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
132e0 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69  Write);.    }.#i
132f0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
13300 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41   else{.      TRA
13310 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
13320 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
13330 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
13340 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
13350 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
13360 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13370 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
13380 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
13390 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
133a0 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
133b0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
133c0 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
133d0 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
133e0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
133f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13400 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13410 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
13420 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
13430 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
13440 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
13450 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
13460 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
13470 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
13480 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
13490 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
134a0 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
134b0 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
134c0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
134d0 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
134e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a  ){.  PgHdr *p, *
134f0 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d  pList;.  pList =
13500 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67   0;.  for(p=pPag
13510 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
13520 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
13530 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b   if( p->dirty ){
13540 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79  .      p->pDirty
13550 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
13560 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  pList = p;.    }
13570 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
13580 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ist;.}../*.** Re
13590 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
135a0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
135b0 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
135c0 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
135d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
135e0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
135f0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
13600 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
13610 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
13620 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
13630 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
13640 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
13650 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
13660 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
13670 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
13680 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
13690 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
136a0 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
136b0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
136c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
136d0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
136e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
136f0 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  f( !pPager->useJ
13700 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20  ournal ) return 
13710 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
13720 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
13730 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
13740 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
13750 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
13760 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
13770 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72  ger->fd) ) retur
13780 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
13790 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
137a0 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
137b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
137c0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
137d0 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  rnal);.    retur
137e0 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
137f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
13800 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
13810 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
13820 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61  he cache that ca
13830 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a  n be recycled. .
13840 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13850 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ne may return SQ
13860 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
13870 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54  TE_FULL or SQLIT
13880 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65  E_OK. It .** doe
13890 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50  s not set the pP
138a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61  ager->errCode va
138b0 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
138c0 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79  c int pager_recy
138d0 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  cle(Pager *pPage
138e0 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50  r, int syncOk, P
138f0 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
13900 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
13910 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  pPg = 0;..  /* F
13920 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
13930 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
13940 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
13950 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
13960 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
13970 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
13980 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
13990 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
139a0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
139b0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
139c0 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
139d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
139e0 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
139f0 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
13a00 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
13a10 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
13a20 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
13a30 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
13a40 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
13a50 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
13a60 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
13a70 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
13a80 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
13a90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
13aa0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
13ab0 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20  First && syncOk 
13ac0 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20  && !MEMDB){.    
13ad0 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
13ae0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
13af0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
13b00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
13b20 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
13b30 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
13b40 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
13b50 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
13b60 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
13b70 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
13b80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
13b90 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
13ba0 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
13bb0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
13bc0 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
13bd0 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
13be0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
13bf0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
13c00 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
13c10 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
13c20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
13c30 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
13c40 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
13c50 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
13c60 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
13c70 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
13c80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
13c90 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
13ca0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13cb0 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
13cc0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
13cd0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
13ce0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
13d00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
13d10 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
13d20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
13d30 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
13d40 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
13d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
13d60 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13d70 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
13d80 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
13d90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
13da0 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
13db0 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
13dc0 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
13dd0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
13de0 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
13df0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  nc==0 );.    pPg
13e00 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13e10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
13e20 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
13e30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
13e40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13e50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13e60 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
13e70 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
13e80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13e90 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
13ea0 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
13eb0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
13ec0 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
13ed0 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
13ee0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
13ef0 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
13f00 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
13f10 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
13f20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
13f30 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
13f40 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
13f50 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
13f60 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
13f70 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
13f80 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
13f90 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
13fa0 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
13fb0 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
13fc0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
13fd0 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
13fe0 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
13ff0 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
14000 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
14010 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
14020 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
14030 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
14040 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
14050 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
14060 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
14070 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
14080 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
14090 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
140a0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
140b0 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
140c0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
140d0 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
140e0 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
140f0 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54  age(pPg);.  TEST
14100 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
14110 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  vfl);..  *ppPg =
14120 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
14130 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14140 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14150 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
14160 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
14170 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
14180 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
14190 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
141a0 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
141b0 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
141c0 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
141d0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
141e0 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
141f0 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
14200 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
14210 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
14220 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
14230 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
14240 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
14250 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
14260 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
14270 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
14280 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
14290 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
142a0 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
142b0 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
142c0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
142d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
142e0 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
142f0 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
14300 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14310 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14320 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
14330 6c 69 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61  lite3pager_relea
14340 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  se_memory(int nR
14350 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
14360 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
14370 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
14380 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
14390 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74   Pager *p;.  int
143a0 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a   nReleased = 0;.
143b0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
143c0 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c  f the the global
143d0 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
143e0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
143f0 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f  becomes a.  ** o
14400 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20  -op; zero bytes 
14410 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72  of memory are fr
14420 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65  eed.  This is be
14430 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20  cause.  ** some 
14440 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f  of the code invo
14450 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ked by this func
14460 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20  tion may also.  
14470 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** try to obtain
14480 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75   the mutex, resu
14490 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c  lting in a deadl
144a0 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
144b0 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
144c0 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (0) ){.    retur
144d0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  n 0;.  }..  /* O
144e0 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75  utermost loop ru
144f0 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74  ns for at most t
14500 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46  wo iterations. F
14510 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77  irst iteration w
14520 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69  e.  ** try to fi
14530 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63  nd memory that c
14540 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  an be released w
14550 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66  ithout calling f
14560 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20  sync(). Second. 
14570 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77   ** iteration (w
14580 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69  hich only runs i
14590 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c  f the first fail
145a0 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20  ed to free nReq 
145b0 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65  bytes of.  ** me
145c0 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74  mory) is permitt
145d0 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63  ed to call fsync
145e0 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63  (). This is of c
145f0 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20  ourse much more 
14600 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e  .  ** expensive.
14610 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
14620 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20   i<=1; i++){..  
14630 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
14640 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65  h all the SQLite
14650 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62   pagers opened b
14660 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
14670 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  read. */.    for
14680 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65  (p=pTsdro->pPage
14690 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20  r; p && (nReq<0 
146a0 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
146b0 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  q); p=p->pNext){
146c0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
146d0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  g;.      int rc;
146e0 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  ..      /* For e
146f0 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74  ach pager, try t
14700 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70  o free as many p
14710 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
14720 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20   (without .     
14730 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e   ** calling fsyn
14740 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74  c() if this is t
14750 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
14760 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  on of the outerm
14770 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ost .      ** lo
14780 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  op)..      */.  
14790 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
147a0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65  E_OK==(rc = page
147b0 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20  r_recycle(p, i, 
147c0 26 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b  &pPg)) && pPg) {
147d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
147e0 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
147f0 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
14800 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
14810 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
14820 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
14830 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
14840 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
14850 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
14860 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
14870 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
14880 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
14890 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
148a0 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
148b0 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
148c0 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
148d0 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
148e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
148f0 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
14900 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
14910 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
14920 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
14930 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
14940 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
14950 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14960 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
14970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14980 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  g );.        pag
14990 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
149a0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
149b0 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
149c0 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
149d0 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70       p->pAll = p
149e0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
149f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14a00 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
14a10 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  =p->pAll; pTmp->
14a20 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
14a30 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
14a40 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ll );.          
14a50 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d  pTmp->pNextAll =
14a60 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
14a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14a80 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73    nReleased += s
14a90 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70  qliteAllocSize(p
14aa0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Pg);.        sql
14ab0 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
14ac0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14ae0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  {.        /* An 
14af0 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
14b00 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
14b10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14b20 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  e or .        **
14b30 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65   journal in page
14b40 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65  r_recycle(). The
14b50 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65   error is not re
14b60 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20  turned to the . 
14b70 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72         ** caller
14b80 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
14b90 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20  n. Instead, set 
14ba0 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64  the Pager.errCod
14bb0 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20  e variable..    
14bc0 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72      ** The error
14bd0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
14be0 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f  d to the user (o
14bf0 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20  r users, in the 
14c00 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  case .        **
14c10 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67   of a shared pag
14c20 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65  er cache) of the
14c30 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
14c40 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
14c50 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
14c60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
14c70 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  c==SQLITE_IOERR 
14c80 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  || rc==SQLITE_FU
14c90 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  LL );.        as
14ca0 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
14cb0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
14cc0 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  ;.        pager_
14cd0 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20  error(p, rc);.  
14ce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14cf0 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
14d00 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
14d10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
14d20 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
14d30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69   */../*.** Acqui
14d40 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
14d50 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
14d60 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
14d70 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
14d80 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
14d90 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
14da0 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
14db0 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
14dc0 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
14dd0 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
14de0 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
14df0 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
14e00 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
14e10 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14e20 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
14e30 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
14e40 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
14e50 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
14e60 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
14e70 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
14e80 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
14e90 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
14ea0 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
14eb0 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
14ec0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
14ed0 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
14ee0 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
14ef0 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
14f00 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
14f10 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
14f20 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
14f30 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
14f40 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
14f50 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
14f60 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
14f70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
14f80 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14f90 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
14fa0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
14fb0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
14fc0 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
14fd0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
14fe0 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
14ff0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
15000 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
15010 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
15020 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
15030 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
15040 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
15050 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
15060 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
15070 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
15080 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
15090 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
150a0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
150b0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
150c0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
150d0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
150e0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
150f0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
15100 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
15110 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
15120 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
15130 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
15140 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
15150 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
15160 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
15170 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
15180 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
15190 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
151a0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
151b0 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
151c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
151d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
151e0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
151f0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
15200 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
15210 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
15220 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
15230 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
15240 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
15250 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
15260 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
15270 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
15280 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
15290 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
152a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
152b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
152c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
152d0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
152e0 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
152f0 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
15300 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15310 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
15320 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
15330 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
15340 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
15350 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
15360 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
15370 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
15380 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
15390 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
153a0 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
153b0 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
153c0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
153d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
153e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
153f0 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  Ref==0 && !MEMDB
15400 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
15410 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
15420 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
15430 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
15440 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
15450 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
15460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15470 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
15480 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
15490 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
154a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
154b0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
154c0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
154d0 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
154e0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
154f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
15500 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
15510 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
15520 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
15530 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
15540 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75     if( hasHotJou
15550 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  rnal(pPager) ){.
15560 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
15570 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
15580 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15590 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
155a0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
155b0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
155c0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
155d0 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
155e0 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
155f0 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45   the.       ** E
15600 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
15610 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
15620 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
15630 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
15640 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
15650 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
15660 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
15670 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
15680 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
15690 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
156a0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
156b0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
156c0 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
156d0 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
156e0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
156f0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
15700 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
15710 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
15720 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
15730 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
15740 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
15750 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
15760 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
15770 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a  fail to.       *
15780 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
15790 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
157a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
157b0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f   file..       */
157c0 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
157d0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
157e0 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
157f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69  _LOCK);.       i
15800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   ){.         sql
15820 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
15830 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
15840 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
15850 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
15860 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
15870 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
15880 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15890 29 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  );.       }.    
158a0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
158b0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
158c0 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f  VE;..       /* O
158d0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
158e0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
158f0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
15900 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
15910 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
15920 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
15930 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
15940 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20     **.       ** 
15950 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
15960 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
15970 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65  o be locked itse
15980 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  lf.  The.       
15990 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
159a0 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e  is never open un
159b0 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61  less the main da
159c0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
159d0 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  s.       ** a wr
159e0 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
159f0 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
15a00 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
15a10 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20   more.       ** 
15a20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e  processes openin
15a30 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74  g the journal at
15a40 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
15a50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15a60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
15a70 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67  penReadOnly(pPag
15a80 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
15a90 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
15aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15ac0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
15ad0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
15ae0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
15af0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
15b00 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
15b10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15b20 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
15b30 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
15b40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15b50 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 1;.       pPag
15b60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
15b70 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  ed = 0;.       p
15b80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15b90 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  f = 0;.       pP
15ba0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
15bb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 0;.       pPag
15bc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
15bd0 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50   0;..       /* P
15be0 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
15bf0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
15c00 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
15c10 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  se write.       
15c20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
15c30 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
15c40 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
15c50 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15c60 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
15c70 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
15c80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15c90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
15ca0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
15cb0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d  r, rc);.       }
15cc0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
15cd0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
15ce0 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
15cf0 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  age in cache */.
15d00 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
15d10 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
15d20 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  gno);.    if( ME
15d30 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73  MDB && pPager->s
15d40 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
15d50 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
15d60 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
15d70 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
15d80 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
15d90 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
15da0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
15db0 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65   not in the page
15dc0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69   cache. */.    i
15dd0 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49  nt h;.    TEST_I
15de0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
15df0 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  s);.    if( pPag
15e00 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
15e10 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67  ->mxPage || pPag
15e20 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c  er->pFirst==0 ||
15e30 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
15e40 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
15e50 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50  page */.      pP
15e60 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
15e70 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
15e80 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
15e90 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
15ec0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
15ed0 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
15f00 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
15f10 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
15f20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15f30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15f40 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
15f50 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
15f60 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
15f70 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
15f80 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
15f90 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
15fa0 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
15fb0 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
15fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
15fd0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
15fe0 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
15ff0 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
16000 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
16010 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
16020 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16030 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
16040 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
16050 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
16060 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16070 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
16080 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
16090 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
160a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
160b0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  age++;.      }. 
160c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
160d0 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
160e0 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  le(pPager, 1, &p
160f0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
16100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16110 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16120 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
16130 20 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20   assert(pPg) ;. 
16140 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
16150 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
16160 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
16170 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
16180 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
16190 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
161a0 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
161b0 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
161c0 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
161d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
161e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
161f0 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
16200 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
16210 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
16220 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
16230 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
16240 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
16250 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
16260 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
16270 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
16280 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
16290 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
162a0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
162b0 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
162c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
162d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
162e0 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
162f0 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
16300 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
16310 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
16320 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
16330 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16340 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
16350 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
16360 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
16370 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
16380 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
16390 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
163a0 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  g);..    pPager-
163b0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
163c0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
163d0 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
163e0 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
163f0 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
16400 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
16410 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16420 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16430 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16440 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
16450 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
16460 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  ;.      rc = pPa
16470 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
16480 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16490 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
164a0 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
164b0 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
164c0 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
164d0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
164e0 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
164f0 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
16500 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
16510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16520 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
16530 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c  gecount(pPager)<
16540 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20  (int)pgno ){.   
16550 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
16560 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
16570 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16580 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
16590 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d       assert( MEM
165a0 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  DB==0 );.      r
165b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
165c0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
165d0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
165e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
165f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16620 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
16630 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16640 50 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Pg),.           
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
16670 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
16680 20 20 20 20 54 52 41 43 45 33 28 22 46 45 54 43      TRACE3("FETC
16690 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
166a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
166b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
166c0 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
166d0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
166e0 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
166f0 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   3);.      if( r
16700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16710 20 20 20 20 20 20 20 20 69 36 34 20 66 69 6c 65          i64 file
16720 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Size;.        in
16730 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 4f  t rc2 = sqlite3O
16740 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
16750 2d 3e 66 64 2c 20 26 66 69 6c 65 53 69 7a 65 29  ->fd, &fileSize)
16760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16770 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  2!=SQLITE_OK || 
16780 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70  fileSize>=pgno*p
16790 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
167a0 29 7b 0a 09 20 20 2f 2a 20 41 6e 20 49 4f 20 65  ){..  /* An IO e
167b0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
167c0 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 65 20 73  one of the the s
167d0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 29 20 6f  qlite3OsSeek() o
167e0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  r.          ** s
167f0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
16800 61 6c 6c 73 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  alls above. */. 
16810 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67           pPg->pg
16820 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
16830 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
16840 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
16850 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
16860 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16870 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16880 20 20 20 20 20 20 20 20 63 6c 65 61 72 5f 73 69          clear_si
16890 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
168a0 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  ();.          me
168b0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
168c0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
168d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
168e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
168f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45  else{.        TE
16900 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
16910 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a  nRead);.      }.
16920 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69      }..    /* Li
16930 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  nk the page into
16940 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74   the page hash t
16950 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20  able */.    h = 
16960 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
16970 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
16980 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
16990 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
169a0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
169b0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
169c0 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
169d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
169e0 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
169f0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
16a00 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
16a10 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
16a20 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
16a30 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
16a40 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
16a50 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
16a60 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
16a70 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
16a80 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
16a90 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
16aa0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
16ab0 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70  .    TEST_INCR(p
16ac0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
16ad0 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
16ae0 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
16af0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16b00 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
16b10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16b20 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
16b30 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
16b40 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
16b50 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
16b60 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
16b70 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
16b80 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
16b90 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
16ba0 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
16bb0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
16bc0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
16bd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
16be0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
16bf0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
16c00 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
16c10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
16c20 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
16c30 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
16c40 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
16c50 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
16c60 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
16c70 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
16c80 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
16c90 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
16ca0 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
16cb0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
16cc0 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
16cd0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
16ce0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76  r happened..*/.v
16cf0 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65  oid *sqlite3page
16d00 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
16d10 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
16d20 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
16d30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
16d40 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
16d50 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
16d60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
16d70 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
16d80 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
16d90 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
16da0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
16db0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
16dc0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
16dd0 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
16de0 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
16df0 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
16e00 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16e10 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
16e20 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
16e30 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
16e40 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
16e50 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
16e60 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
16e70 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
16e80 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
16e90 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
16ea0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
16eb0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
16ec0 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
16ed0 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
16ee0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
16ef0 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
16f00 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
16f10 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
16f20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
16f30 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
16f40 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
16f50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
16f60 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
16f70 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f  */.  pPg = DATA_
16f80 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
16f90 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
16fa0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
16fb0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
16fc0 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43  FO(pPg);..  CHEC
16fd0 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
16fe0 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
16ff0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
17000 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
17010 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
17020 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
17030 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
17040 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
17050 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
17060 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
17070 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
17080 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
17090 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
170a0 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
170b0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
170c0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
170d0 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
170e0 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
170f0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
17100 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
17110 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
17120 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
17130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
17140 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
17150 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
17160 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
17170 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
17180 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
17190 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
171a0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
171b0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
171c0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
171d0 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
171e0 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
171f0 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
17200 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17210 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
17220 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
17230 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
17240 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
17250 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
17260 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
17280 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
17290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
172a0 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
172b0 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
172c0 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a  =0 && !MEMDB ){.
172d0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
172e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  t(pPager);.    }
172f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
17300 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17310 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e  * Create a journ
17320 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  al file for pPag
17330 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c  er.  There shoul
17340 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  d already be a R
17350 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58  ESERVED.** or EX
17360 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
17370 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17380 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
17390 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
173a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
173b0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
173c0 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ing.  Return an 
173d0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72  error code and r
173e0 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72  elease the.** wr
173f0 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74  ite lock if anyt
17400 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
17410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
17420 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
17430 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
17440 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
17450 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
17460 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17470 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
17480 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
17490 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
174a0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
174b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
174c0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
174d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
174e0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
174f0 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
17500 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
17510 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
17520 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
17530 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
17540 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
17550 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
17560 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
17570 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17580 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
17590 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
175a0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63  ournal;.  }.  rc
175b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
175c0 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72  Exclusive(pPager
175d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
175e0 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20  ger->jfd,.      
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17600 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
17610 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
17620 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17630 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
17640 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
17650 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
17660 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
17670 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17680 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  {.    goto faile
17690 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
176a0 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
176b0 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
176c0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
176d0 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  r->fullSync);.  
176e0 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
176f0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
17700 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
17710 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f  c);.  sqlite3OsO
17720 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61  penDirectory(pPa
17730 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
17740 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  ->zDirectory);. 
17750 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17760 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
17770 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
17780 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
17790 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
177a0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
177b0 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
177c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
177d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
177e0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
177f0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
17800 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
17810 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
17820 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
17830 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
17840 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
17850 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
17860 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
17870 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
17880 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
17890 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
178a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
178b0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
178c0 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
178d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
178e0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
178f0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  E_NOMEM ){.    r
17900 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
17910 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
17920 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
17940 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
17950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17960 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
17970 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
17980 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
17990 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
179a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
179b0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66  ournal = 0;.  if
179c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
179d0 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  EM ){.    /* If 
179e0 74 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f  this was a mallo
179f0 63 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68 65  c() failure, the
17a00 6e 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  n we will not be
17a10 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67   closing the pag
17a20 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  er.    ** file. 
17a30 53 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f  So delete any jo
17a40 75 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d 61  urnal file we ma
17a50 79 20 68 61 76 65 20 6a 75 73 74 20 63 72 65 61  y have just crea
17a60 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ted. Otherwise,.
17a70 20 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74 65      ** the syste
17a80 6d 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75  m will get confu
17a90 73 65 64 2c 20 77 65 20 68 61 76 65 20 61 20 72  sed, we have a r
17aa0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
17ab0 66 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20 2a  file and a.    *
17ac0 2a 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f 75  * mysterious jou
17ad0 72 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72 65  rnal has appeare
17ae0 64 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  d in the filesys
17af0 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tem..    */.    
17b00 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
17b10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
17b20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17b30 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
17b40 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
17b50 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
17b60 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
17b70 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65  UNLOCK;.  }.  re
17b80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17b90 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74  * Acquire a writ
17ba0 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e-lock on the da
17bb0 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63  tabase.  The loc
17bc0 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65  k is removed whe
17bd0 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20  n.** the any of 
17be0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61  the following ha
17bf0 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ppen:.**.**   * 
17c00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
17c10 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64  mmit() is called
17c20 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
17c30 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
17c40 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
17c50 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
17c60 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  r_close() is cal
17c70 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
17c80 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
17c90 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
17ca0 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
17cb0 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
17cc0 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
17cd0 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
17ce0 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
17cf0 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
17d00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
17d10 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
17d20 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
17d30 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
17d40 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
17d50 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
17d60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
17d70 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
17d80 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
17d90 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
17da0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
17db0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
17dc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
17dd0 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
17de0 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
17df0 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
17e00 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
17e10 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
17e20 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
17e30 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
17e40 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
17e50 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
17e60 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
17e70 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
17e80 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
17e90 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
17ea0 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
17eb0 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
17ec0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
17ed0 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
17ee0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
17ef0 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
17f00 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
17f10 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
17f20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
17f30 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
17f40 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
17f50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17f60 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
17f70 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
17f80 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
17f90 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
17fa0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
17fb0 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
17fc0 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
17fd0 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
17fe0 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
17ff0 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
18000 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
18010 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
18020 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
18030 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18040 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69  3pager_begin(voi
18050 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78  d *pData, int ex
18060 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  Flag){.  PgHdr *
18070 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
18080 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
18090 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
180a0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
180b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
180c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
180d0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
180e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
180f0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
18100 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
18110 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
18120 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
18130 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
18140 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
18150 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
18160 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
18170 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
18180 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
18190 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
181a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
181b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
181c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
181d0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
181e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
181f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18210 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
18220 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
18230 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
18240 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
18250 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
18260 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
18270 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
18280 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
18290 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
182a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
182b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
182c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
182d0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
182e0 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ache = 0;.      
182f0 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
18300 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
18310 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18320 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
18330 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
18340 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
18350 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
18360 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
18370 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
18380 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
18390 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
183a0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
183b0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
183c0 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
183d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
183e0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
183f0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
18400 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
18410 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
18420 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
18430 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
18440 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
18450 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
18460 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
18470 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
18480 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
18490 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
184a0 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
184b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
184c0 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
184d0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
184e0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
184f0 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
18500 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
18510 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
18520 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
18530 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
18540 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
18550 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
18560 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
18570 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
18580 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
18590 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
185a0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
185b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
185c0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
185d0 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
185e0 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
185f0 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
18600 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
18610 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
18620 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
18630 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
18640 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
18650 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
18660 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
18670 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
18680 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
18690 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
186a0 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67  () or sqlite3pag
186b0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  er_rollback() to
186c0 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e  .** reset..*/.in
186d0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  t sqlite3pager_w
186e0 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61  rite(void *pData
186f0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
18700 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
18710 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
18720 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
18730 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
18740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
18750 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
18760 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
18770 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
18780 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  { .    return pP
18790 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
187a0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
187b0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
187c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
187d0 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
187e0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
187f0 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
18800 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
18810 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
18820 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
18830 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
18840 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
18850 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
18860 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
18870 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
18880 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  way..  */.  pPg-
18890 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66  >dirty = 1;.  if
188a0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
188b0 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74   && (pPg->inStmt
188c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   || pPager->stmt
188d0 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20  InUse==0) ){.   
188e0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
188f0 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  che = 1;.  }else
18900 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  {..    /* If we 
18910 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
18920 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
18930 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
18940 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  .    ** written 
18950 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
18960 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
18970 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
18980 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62  rnal.    ** or b
18990 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oth..    **.    
189a0 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
189b0 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
189c0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
189d0 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
189e0 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
189f0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
18a00 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
18a10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18a20 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
18a30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18a40 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61  3pager_begin(pDa
18a50 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ta, 0);.    if( 
18a60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18a70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18a90 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18aa0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
18ab0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
18ac0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18ad0 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
18ae0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
18af0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
18b00 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
18b10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18b20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
18b30 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18b40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18b50 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
18b60 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
18b70 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
18b80 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
18b90 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
18ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
18bb0 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
18bc0 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
18bd0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
18be0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
18bf0 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
18c00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
18c10 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
18c20 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
18c30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18c40 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
18c50 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
18c60 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
18c70 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
18c80 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75  al && (pPager->u
18c90 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d  seJournal || MEM
18ca0 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DB) ){.      if(
18cb0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
18cc0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
18cd0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
18ce0 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20   int szPg;.     
18cf0 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20     u32 saved;.  
18d00 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
18d10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
18d20 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
18d30 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
18d40 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
18d50 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
18d60 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
18d70 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18d80 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
18d90 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
18da0 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
18db0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
18dc0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
18dd0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
18de0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18df0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
18e00 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
18e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
18e20 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
18e30 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
18e40 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
18e50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
18e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18e80 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
18e90 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
18ea0 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
18eb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18ec0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
18ed0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
18ee0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
18ef0 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
18f00 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
18f10 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
18f20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
18f30 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
18f40 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
18f50 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
18f60 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
18f70 20 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70           CODEC(p
18f80 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
18f90 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
18fa0 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
18fb0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
18fc0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44  r, pPg->pgno, pD
18fd0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ata);.          
18fe0 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50  saved = *(u32*)P
18ff0 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
19000 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
19010 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
19020 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50  s(cksum, pPg, pP
19030 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19040 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20  .          szPg 
19050 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
19060 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+8;.          
19070 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
19080 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
19090 0a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ..          rc =
190a0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
190b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28  pPager->jfd, &((
190c0 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d  char*)pData)[-4]
190d0 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20  , szPg);.       
190e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
190f0 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20  alOff += szPg;. 
19100 20 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28           TRACE4(
19110 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
19120 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
19130 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19140 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
19150 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
19160 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
19170 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44 45  ;.          CODE
19180 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
19190 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a   pPg->pgno, 0);.
191a0 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a            *(u32*
191b0 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  )PGHDR_TO_EXTRA(
191c0 70 50 67 2c 20 70 50 61 67 65 72 29 20 3d 20 73  pPg, pPager) = s
191d0 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20  aved;...  /* An 
191e0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
191f0 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
19200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
19210 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
19220 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
19230 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
19240 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
19250 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
19260 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
19270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19280 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
19290 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
192a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
192b0 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
192c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
192d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
192e0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
192f0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
19300 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
19310 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
19320 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
19330 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
19340 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
19350 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
19360 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
19370 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
19380 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
19390 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
193a0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
193b0 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &7);.           
193c0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
193d0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
193e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
193f0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
19400 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
19410 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
19420 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
19430 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
19440 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  nc;.        TRAC
19450 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E4("APPEND %d pa
19460 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
19470 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
19480 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
19490 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
194a0 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
194b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
194c0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
194d0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
194e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
194f0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
19500 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
19510 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 1;.    }.  .  
19520 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
19530 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
19540 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
19550 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
19560 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
19570 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
19580 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
19590 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
195a0 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
195b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
195c0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
195d0 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
195e0 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
195f0 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
19600 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
19610 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
19620 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
19630 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
19640 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
19650 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
19660 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
19670 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
19680 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19690 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
196a0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
196b0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
196c0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  bSize );.      i
196d0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
196e0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
196f0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
19700 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
19710 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
19720 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
19730 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  =0 );.        pH
19740 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
19750 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
19760 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
19770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
19780 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
19790 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
197a0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
197b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
197c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
197d0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
197e0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
197f0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
19800 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
19810 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19820 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pgno);.      }el
19830 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  se{.        stor
19840 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
19850 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
19860 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
19870 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
19880 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
19890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
198a0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  rite(pPager->stf
198b0 64 2c 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  d,((char*)pData)
198c0 2d 34 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -4,.            
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
198f0 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  ize+4);.        
19900 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
19910 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
19920 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19930 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
19940 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
19950 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
19960 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
19970 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19990 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
199a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
199b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
199c0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
199d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
199e0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt!=0 );.     
199f0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
19a00 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
19a10 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
19a20 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  &7);.      }.   
19a30 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
19a40 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
19a50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
19a60 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
19a70 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
19a80 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rn..  */.  if( p
19a90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
19aa0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
19ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
19ac0 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
19ad0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26      if( !MEMDB &
19ae0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
19af0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
19b00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19b10 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
19b20 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
19b30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19b50 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
19b60 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
19b70 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
19b80 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
19b90 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  * to sqlite3page
19ba0 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  r_write().  In o
19bb0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
19bc0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
19bd0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
19be0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
19bf0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
19c00 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
19c10 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77  sqlite3pager_isw
19c20 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70  riteable(void *p
19c30 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
19c40 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
19c50 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65  HDR(pData);.  re
19c60 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b  turn pPg->dirty;
19c70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
19c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19c90 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  ACUUM./*.** Repl
19ca0 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
19cb0 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
19cc0 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
19cd0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
19ce0 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
19cf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19d00 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61  ger_overwrite(Pa
19d10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19d20 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
19d30 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ata){.  void *pP
19d40 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
19d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
19d60 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
19d70 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
19d80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19d90 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
19da0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
19db0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
19dc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19dd0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
19de0 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70 50  pPage, pData, pP
19df0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19e00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19e10 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
19e20 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
19e30 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
19e40 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
19e50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
19e60 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
19e70 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
19e80 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
19e90 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
19ea0 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
19eb0 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
19ec0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
19ed0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
19ee0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
19ef0 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
19f00 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
19f10 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
19f20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
19f30 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
19f40 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
19f50 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
19f60 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
19f70 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
19f80 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
19f90 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
19fa0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
19fb0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
19fc0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
19fd0 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
19fe0 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
19ff0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1a000 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  _rollback() belo
1a010 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
1a020 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
1a030 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
1a040 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
1a050 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
1a060 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1a070 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1a080 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a090 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1a0a0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1a0b0 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1a0c0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1a0d0 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  s to sqlite3page
1a0e0 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
1a0f0 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
1a100 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
1a110 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
1a120 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
1a130 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
1a140 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
1a150 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
1a160 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
1a170 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1a180 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
1a190 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
1a1a0 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
1a1b0 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
1a1c0 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
1a1d0 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
1a1e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
1a1f0 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
1a200 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
1a210 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
1a220 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
1a230 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
1a240 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a250 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
1a260 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72  d,.** the dont_r
1a270 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1a280 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1a290 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  t because the pa
1a2a0 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63  ge contains.** c
1a2b0 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1a2c0 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1a2d0 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72  e sure it gets r
1a2e0 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
1a2f0 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f  ite.** of the do
1a300 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61  nt_rollback() ca
1a310 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
1a320 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
1a330 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
1a340 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1a350 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1a360 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1a370 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
1a380 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1a390 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e  , pgno);.  pPg->
1a3a0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1a3b0 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26   1;.  if( pPg &&
1a3c0 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21   pPg->dirty && !
1a3d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1a3e0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1a3f0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
1a400 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
1a410 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a420 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
1a430 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1a440 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
1a450 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
1a460 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
1a470 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
1a480 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
1a490 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1a4a0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
1a4b0 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
1a4c0 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
1a4d0 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
1a4e0 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
1a4f0 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
1a500 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
1a510 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
1a520 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
1a530 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
1a540 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
1a550 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
1a560 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
1a570 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
1a580 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
1a590 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
1a5a0 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
1a5b0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
1a5c0 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
1a5d0 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
1a5e0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1a5f0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
1a600 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
1a610 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
1a620 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1a630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
1a640 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54  RACE3("DONT_WRIT
1a650 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
1a660 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49  n", pgno, PAGERI
1a670 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1a680 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1a690 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a6a0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1a6b0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
1a6c0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1a6d0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
1a6e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a6f0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1a700 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1a710 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
1a720 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1a730 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
1a740 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
1a750 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
1a760 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
1a770 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
1a780 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
1a790 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
1a7a0 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
1a7b0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
1a7c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a7d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a7e0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
1a7f0 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
1a800 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1a810 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1a820 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
1a830 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1a840 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
1a850 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1a860 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
1a870 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a880 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
1a890 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
1a8a0 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
1a8b0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1a8c0 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20  back || MEMDB ) 
1a8d0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
1a8e0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1a8f0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
1a900 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
1a910 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
1a920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1a930 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1a940 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1a950 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
1a960 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1a970 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
1a980 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1a990 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1a9a0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1a9b0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1a9c0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1a9d0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1a9e0 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
1a9f0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1aa00 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
1aa10 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
1aa20 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
1aa30 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1aa40 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1aa50 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  r));.  }.  if( p
1aa60 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1aa70 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
1aa80 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1aa90 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
1aaa0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
1aab0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1aac0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1aad0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1aae0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
1aaf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1ab00 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1ab10 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1ab20 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1ab30 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1ab40 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
1ab50 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1ab60 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64  );.  }.}...#ifnd
1ab70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
1ab80 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
1ab90 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
1aba0 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
1abb0 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
1abc0 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
1abd0 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
1abe0 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
1abf0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
1ac00 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
1ac10 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
1ac20 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
1ac30 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
1ac40 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
1ac50 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
1ac60 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1ac70 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1ac80 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
1ac90 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1aca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1acb0 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
1acc0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
1acd0 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
1ace0 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
1acf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ad00 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
1ad10 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
1ad20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1ad30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1ad40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
1ad50 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
1ad60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1ad70 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1ad80 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1ad90 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
1ada0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1adb0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1adc0 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
1add0 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
1ade0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1adf0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43  RROR;.  }.  TRAC
1ae00 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E2("COMMIT %d\n"
1ae10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1ae20 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1ae30 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  ){.    pPg = pag
1ae40 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1ae50 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
1ae60 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29      while( pPg )
1ae70 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  {.      clearHis
1ae80 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
1ae90 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
1aea0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
1aeb0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
1aec0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
1aed0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
1aee0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1aef0 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
1af00 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
1af10 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   0;.      pPg = 
1af20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
1af30 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1af40 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
1af50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1af60 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1af70 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
1af80 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1af90 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1afa0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1afb0 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
1afc0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1afd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1afe0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
1aff0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
1b000 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
1b010 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
1b020 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1b030 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1b040 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1b050 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1b060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1b070 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  if( pPager->dirt
1b080 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  yCache==0 ){.   
1b090 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28   /* Exit early (
1b0a0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68  without doing th
1b0b0 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67  e time-consuming
1b0c0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
1b0d0 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69   calls).    ** i
1b0e0 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  f there have bee
1b0f0 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20  n no changes to 
1b100 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b110 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1b120 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1b130 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  nc==0 );.    rc 
1b140 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1b150 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1b160 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1b170 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  = -1;.    return
1b180 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1b190 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1b1a0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
1b1b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1b1c0 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  nc(pPager, 0, 0)
1b1d0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1b1e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1b1f0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1b200 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1b210 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1b220 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1b230 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b240 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
1b250 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
1b260 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
1b270 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
1b280 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
1b290 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
1b2a0 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
1b2b0 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
1b2c0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
1b2d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
1b2e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
1b2f0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
1b300 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
1b310 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1b320 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
1b330 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
1b340 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
1b350 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
1b360 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
1b370 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
1b380 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
1b390 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
1b3a0 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
1b3b0 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
1b3c0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
1b3d0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
1b3e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
1b3f0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1b400 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
1b410 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
1b420 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
1b430 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
1b440 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1b450 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
1b460 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
1b470 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1b480 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
1b490 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
1b4a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1b4b0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1b4c0 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
1b4d0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1b4e0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
1b4f0 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
1b500 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
1b510 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
1b520 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
1b530 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1b540 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
1b550 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1b560 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1b570 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1b580 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
1b590 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
1b5a0 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
1b5b0 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
1b5c0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
1b5d0 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
1b5e0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1b5f0 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
1b600 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1b610 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
1b620 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1b630 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
1b640 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
1b650 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
1b660 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
1b670 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1b680 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43   TRACE3("ROLLBAC
1b690 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
1b6a0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1b6b0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b6c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b6d0 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47 45      TRACE3("PAGE
1b6e0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
1b6f0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
1b700 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1b710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b720 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
1b730 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
1b740 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1b750 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1b760 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74  .      p->inStmt
1b770 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
1b780 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e  PrevStmt = p->pN
1b790 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  extStmt = 0;..  
1b7a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b7b0 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
1b7c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1b7d0 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
1b7e0 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d  DATA(p), pPager-
1b7f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1b800 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 7d    }.      .    }
1b810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
1b820 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
1b830 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1b840 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1b850 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
1b860 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
1b870 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1b880 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
1b890 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1b8a0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
1b8b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b8c0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1b8d0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
1b8e0 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
1b8f0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
1b900 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1b910 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1b920 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1b930 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
1b940 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
1b950 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b960 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1b970 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1b980 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1b990 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1b9a0 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
1b9b0 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
1b9c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1b9d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  }.    return pPa
1b9e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1b9f0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1ba00 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1ba10 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
1ba20 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70   rc2;.    rc = p
1ba30 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
1ba40 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
1ba50 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  c2 = pager_unwri
1ba60 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1ba70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ba80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ba90 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
1baa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1bab0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1bac0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70  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 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
1baf0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
1bb00 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
1bb10 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
1bb20 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
1bb30 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
1bb40 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
1bb50 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
1bb60 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
1bb70 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
1bb80 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  tent..  */.  ret
1bb90 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1bba0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
1bbb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1bbc0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
1bbd0 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
1bbe0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
1bbf0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
1bc00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1bc10 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
1bc20 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
1bc30 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
1bc40 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
1bc50 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1bc60 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
1bc70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1bc80 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
1bc90 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
1bca0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
1bcb0 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65  int *sqlite3page
1bcc0 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
1bcd0 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
1bce0 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
1bcf0 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
1bd00 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
1bd10 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
1bd20 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
1bd30 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
1bd40 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
1bd50 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
1bd60 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
1bd70 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 23  ager->errCode;.#
1bd80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1bd90 54 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  T.  a[6] = pPage
1bda0 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
1bdb0 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
1bdc0 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
1bdd0 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20  ->nOvfl;.  a[9] 
1bde0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
1bdf0 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
1be00 72 2d 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69  r->nWrite;.#endi
1be10 66 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  f.  return a;.}.
1be20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
1be30 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
1be40 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
1be50 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
1be60 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
1be70 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
1be80 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
1be90 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
1bea0 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
1beb0 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
1bec0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
1bed0 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
1bee0 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
1bef0 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
1bf00 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
1bf10 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
1bf20 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1bf30 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72  stmt_begin(Pager
1bf40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1bf50 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d   rc;.  char zTem
1bf60 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
1bf70 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72  E_SIZE];.  asser
1bf80 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
1bf90 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
1bfa0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
1bfb0 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32  e>=0 );.  TRACE2
1bfc0 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
1bfd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1bfe0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1bff0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
1c000 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1c010 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c020 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1c030 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
1c040 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c050 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1c060 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1c070 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
1c080 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
1c090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c0a0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1c0b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c0c0 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
1c0d0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
1c0e0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1c0f0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1c100 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1c110 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
1c120 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
1c130 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
1c140 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
1c150 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c160 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
1c170 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
1c180 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1c190 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1c1a0 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
1c1b0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
1c1c0 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1c1d0 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
1c1e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
1c1f0 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
1c200 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
1c210 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
1c220 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
1c230 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
1c240 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1c250 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1c260 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
1c270 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
1c280 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
1c290 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
1c2a0 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
1c2b0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1c2c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1c2d0 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
1c2e0 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
1c2f0 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28  ->stfd);.    if(
1c300 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1c310 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1c320 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
1c330 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
1c340 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
1c350 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1c360 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
1c370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c380 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
1c390 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
1c3a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
1c3b0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
1c3c0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
1c3d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1c3e0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
1c3f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c400 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
1c410 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
1c420 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1c430 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
1c440 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
1c450 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1c460 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1c470 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
1c480 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
1c490 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
1c4a0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1c4b0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
1c4c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
1c4d0 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
1c4e0 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
1c4f0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
1c500 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
1c510 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
1c520 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
1c530 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
1c540 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1c550 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
1c560 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1c570 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
1c580 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
1c590 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
1c5a0 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
1c5b0 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
1c5c0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
1c5d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1c5e0 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
1c5f0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
1c600 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   0;.      if( ME
1c610 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
1c620 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1c630 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1c640 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1c650 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1c660 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
1c670 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1c680 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c690 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
1c6a0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
1c6b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1c6c0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
1c6d0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
1c6e0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
1c6f0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
1c700 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1c710 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c720 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
1c730 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1c740 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1c750 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  rollback(Pager *
1c760 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1c770 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
1c780 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1c790 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52    TRACE2("STMT-R
1c7a0 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
1c7b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1c7c0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
1c7d0 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
1c7e0 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  Pg;.      for(pP
1c7f0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
1c800 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1c810 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
1c820 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1c830 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1c840 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1c850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
1c860 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
1c870 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
1c880 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1c890 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
1c8a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c8b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1c8c0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
1c8d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
1c8e0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1c8f0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1c900 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c910 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1c920 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
1c930 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63       memoryTrunc
1c940 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
1c950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c960 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1c970 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
1c980 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
1c990 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
1c9a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1c9b0 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
1c9c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1c9d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c9e0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1c9f0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
1ca00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ca10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ca20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
1ca30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ca40 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1ca50 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1ca60 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  filename(Pager *
1ca70 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1ca80 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
1ca90 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
1caa0 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
1cab0 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
1cac0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
1cad0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
1cae0 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67  ager_dirname(Pag
1caf0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1cb00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
1cb10 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
1cb20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1cb30 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1cb40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1cb50 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1cb60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75  sqlite3pager_jou
1cb70 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
1cb80 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1cb90 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
1cba0 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
1cbb0 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
1cbc0 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
1cbd0 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
1cbe0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
1cbf0 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
1cc00 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
1cc10 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
1cc20 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6e  t sqlite3pager_n
1cc30 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
1cc40 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1cc50 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
1cc60 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1cc70 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
1cc80 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
1cc90 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f  ite3pager_set_co
1cca0 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
1ccb0 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78  ager,.  void (*x
1ccc0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
1ccd0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
1cce0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
1ccf0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
1cd00 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
1cd10 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
1cd20 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
1cd30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1cd40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1cd50 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1cd60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1cd70 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1cd80 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1cd90 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1cda0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1cdb0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1cdc0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1cdd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76  er *pPager){.  v
1cde0 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67  oid *pPage;.  Pg
1cdf0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
1ce00 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1ce10 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1ce20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1ce30 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1ce40 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  riting. */.  rc 
1ce50 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1ce60 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
1ce70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1ce80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1ce90 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
1cea0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1ceb0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1cec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ced0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1cee0 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e   Read the curren
1cef0 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20  t value at byte 
1cf00 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20  24. */.  pPgHdr 
1cf10 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1cf20 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65  pPage);.  change
1cf30 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1cf40 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1cf50 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63  , 24);..  /* Inc
1cf60 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1cf70 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1cf80 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1cf90 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1cfa0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1cfb0 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 68    store32bits(ch
1cfc0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50  ange_counter, pP
1cfd0 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a  gHdr, 24);..  /*
1cfe0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
1cff0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
1d000 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1d010 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72  nref(pPage);.  r
1d020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1d040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d050 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1d060 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1d070 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1d080 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1d090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1d0a0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1d0b0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1d0c0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1d0d0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1d0e0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1d0f0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1d100 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1d110 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1d120 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1d130 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1d140 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d150 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1d160 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1d170 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1d180 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1d190 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1d1a0 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1d1b0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1d1c0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1d1d0 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1d1e0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1d1f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1d200 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1d210 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1d220 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d230 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1d240 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1d250 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1d260 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1d270 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1d280 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1d290 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1d2a0 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
1d2b0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
1d2c0 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
1d2d0 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
1d2e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
1d2f0 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
1d300 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
1d310 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
1d320 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1d330 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69  databases)..*/.i
1d340 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1d350 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
1d360 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
1d370 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
1d380 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
1d390 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d3a0 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
1d3b0 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
1d3c0 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
1d3d0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
1d3e0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1d3f0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
1d400 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
1d410 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1d420 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
1d430 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
1d440 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
1d450 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
1d460 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1d470 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1d480 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1d490 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1d4a0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
1d4b0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1d4c0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
1d4d0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1d4e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d4f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1d500 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
1d510 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d520 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
1d530 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1d540 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
1d550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1d560 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
1d570 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
1d580 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
1d590 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
1d5a0 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
1d5b0 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
1d5c0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
1d5d0 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
1d5e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
1d5f0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
1d600 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
1d610 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
1d620 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1d630 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
1d640 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
1d650 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
1d660 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1d670 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1d680 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1d690 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1d6a0 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
1d6b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d6c0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d6d0 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
1d6e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1d6f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
1d700 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1d710 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1d720 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
1d730 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
1d740 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
1d750 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
1d760 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
1d770 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
1d780 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
1d790 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d7a0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1d7b0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
1d7c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1d7d0 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64   i;.        void
1d7e0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1d7f0 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
1d800 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1d810 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
1d820 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
1d830 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d840 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
1d850 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
1d860 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
1d870 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
1d880 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
1d890 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d8a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1d8b0 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1d8c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d8d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d8e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1d8f0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1d900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1d910 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1d920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1d930 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1d940 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1d950 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d960 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d970 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1d980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
1d990 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d9a0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
1d9b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1d9c0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1d9d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d9e0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d9f0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
1da00 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1da10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1da20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1da30 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1da40 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
1da50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1da60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1da70 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1da80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1da90 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1daa0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1dab0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dac0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1dad0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1dae0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
1daf0 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
1db00 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
1db10 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1db20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1db30 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1db40 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1db50 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1db60 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1db70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1db80 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1db90 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
1dba0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1dbb0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1dbc0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1dbd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1dbe0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1dbf0 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
1dc00 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
1dc10 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
1dc20 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  NCED;.  }..sync_
1dc30 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1dc40 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1dc50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1dc60 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
1dc70 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
1dc80 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
1dc90 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
1dca0 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
1dcb0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1dcc0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1dcd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1dce0 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1dcf0 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1dd00 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1dd10 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1dd20 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1dd30 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1dd40 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1dd50 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1dd60 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1dd70 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1dd80 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1dd90 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1dda0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1ddb0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1ddc0 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1ddd0 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1dde0 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1ddf0 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1de00 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1de10 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1de20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1de30 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1de40 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1de50 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1de60 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1de70 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1de80 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1de90 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1dea0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1deb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1dec0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
1ded0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
1dee0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1def0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
1df00 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
1df10 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
1df20 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
1df30 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
1df40 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
1df50 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
1df60 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
1df70 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
1df80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1df90 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1dfa0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1dfb0 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1dfc0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1dfd0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1dfe0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1dff0 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1e000 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1e010 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1e020 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1e030 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1e040 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1e050 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1e060 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1e070 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1e080 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1e090 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1e0a0 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  nc, pgno);..  if
1e0b0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1e0c0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
1e0d0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1e0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1e0f0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1e100 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1e110 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
1e120 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1e130 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
1e140 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1e150 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1e160 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1e170 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1e180 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1e190 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1e1a0 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1e1b0 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
1e1c0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
1e1d0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
1e1e0 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
1e1f0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1e200 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
1e210 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
1e220 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
1e230 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
1e240 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
1e250 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
1e260 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
1e270 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
1e280 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1e290 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1e2a0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
1e2b0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1e2c0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1e2d0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
1e2e0 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
1e2f0 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69  ;.    pPgOld->di
1e300 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1e310 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
1e320 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1e330 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
1e340 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
1e350 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1e360 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1e370 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1e380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e390 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1e3a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
1e3b0 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1e3c0 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1e3d0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1e3e0 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1e3f0 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e  n. */.  pPg->pgn
1e400 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
1e410 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
1e420 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e430 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1e440 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e450 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1e460 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1e470 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1e480 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1e490 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1e4a0 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1e4b0 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1e4c0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1e4d0 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1e4e0 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67  Hash = 0;..  pPg
1e4f0 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70  ->dirty = 1;.  p
1e500 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1e510 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
1e520 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
1e530 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
1e540 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
1e550 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1e560 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
1e570 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
1e580 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
1e590 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1e5a0 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1e5b0 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
1e5c0 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
1e5d0 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
1e5e0 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
1e5f0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
1e600 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
1e610 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
1e620 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
1e630 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
1e640 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
1e650 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
1e660 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1e670 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
1e680 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1e690 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
1e6a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e6b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e6c0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
1e6d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
1e6e0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
1e6f0 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
1e700 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1e710 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
1e720 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
1e730 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65  ;.    void *pNee
1e740 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72  dSync;.    asser
1e750 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e760 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
1e770 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e780 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
1e790 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e  cPgno, &pNeedSyn
1e7a0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
1e7b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1e7c0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
1e7d0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1e7e0 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1e7f0 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e  DR(pNeedSync)->n
1e800 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1e810 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1e820 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75  NeedSync)->inJou
1e830 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41  rnal = 1;.    DA
1e840 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1e850 64 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20  dSync)->dirty = 
1e860 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  1;.    sqlite3pa
1e870 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53  ger_unref(pNeedS
1e880 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ync);.  }..  ret
1e890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e8a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1e8b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1e8c0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1e8d0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1e8e0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1e8f0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1e900 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
1e910 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
1e920 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1e930 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
1e940 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
1e950 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
1e960 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
1e970 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
1e980 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
1e990 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
1e9a0 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
1e9b0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
1e9c0 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
1e9d0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
1e9e0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1e9f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1ea00 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
1ea10 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
1ea20 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
1ea30 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
1ea40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1ea50 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
1ea60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
1ea70 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
1ea80 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
1ea90 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1eaa0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
1eab0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
1eac0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ead0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1eae0 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
1eaf0 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
1eb00 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
1eb10 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
1eb20 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
1eb30 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
1eb40 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
1eb50 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
1eb60 2f 0a                                            /.