/ Hex Artifact Content
Login

Artifact 07509ddb478f5a70f9ff53607ab8a44456c22811:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 32 33  : pager.c,v 1.23
0350: 30 20 32 30 30 36 2f 30 31 2f 30 35 20 31 33 3a  0 2006/01/05 13:
0360: 34 38 3a 32 39 20 64 61 6e 69 65 6c 6b 31 39 37  48:29 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20   TRACE1(X)      
0450: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0460: 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 54  ntf(X).#define T
0470: 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20 73  RACE2(X,Y)     s
0480: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0490: 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54  f(X,Y).#define T
04a0: 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73  RACE3(X,Y,Z)   s
04b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
04c0: 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  f(X,Y,Z).#define
04d0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
04e0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04f0: 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65  ntf(X,Y,Z,W).#de
0500: 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c  fine TRACE5(X,Y,
0510: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0540: 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64 65  ne TRACE1(X).#de
0550: 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29  fine TRACE2(X,Y)
0560: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
0570: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54  X,Y,Z).#define T
0580: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23  RACE4(X,Y,Z,W).#
0590: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
05a0: 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66 0a  Y,Z,W,V).#endif.
05b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
05c0: 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20  wing two macros 
05d0: 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20  are used within 
05e0: 74 68 65 20 54 52 41 43 45 58 28 29 20 6d 61 63  the TRACEX() mac
05f0: 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20  ros above.** to 
0600: 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64  print out file-d
0610: 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a  escriptors. .**.
0620: 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61 6b  ** PAGERID() tak
0630: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
0640: 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20 61  a Pager struct a
0650: 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e  s it's argument.
0660: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0670: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0680: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0690: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
06a0: 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a  akes an OsFile.*
06b0: 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73  * struct as it's
06c0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64   argument..*/.#d
06d0: 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29  efine PAGERID(p)
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 26 28   FILEHANDLEID(&(
06f0: 70 29 2d 3e 66 64 29 0a 23 64 65 66 69 6e 65 20  p)->fd).#define 
0700: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0710: 20 28 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 48   (sqlite3OsFileH
0720: 61 6e 64 6c 65 28 26 66 64 29 29 0a 0a 2f 2a 0a  andle(&fd))../*.
0730: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0740: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0750: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
0760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0770: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
0780: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
0790: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07a0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07b0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
07c0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
07d0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
07e0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
07f0: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0800: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0810: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0820: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0830: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0840: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0860: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
0870: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
0880: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0890: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
08d0: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
08e0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0910: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0920: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0940: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0950: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
0960: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
0970: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
0980: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
0990: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09a0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
09c0: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
09d0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
09e0: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
09f0: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a20: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a30: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a40: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0a70: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0a80: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0ab0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0ac0: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0ad0: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0ae0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0af0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b00: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b10: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b20: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b30: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0b60: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0b70: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0b80: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0ba0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bb0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0bc0: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0bf0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c00: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c10: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c20: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c30: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c40: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0c60: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0c70: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0c80: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cb0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0cc0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0cd0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0cf0: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d00: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d10: 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0d40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0d50: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0d80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0d90: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0da0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0db0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0dc0: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
0dd0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
0de0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0df0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0e00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0e10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0e20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0e30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0e40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0e50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0e70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0e80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0e90: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0ea0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0eb0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ec0: 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  ons to.** PAGER_
0ed0: 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65  RESERVED.  (Note
0ee0: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0ef0: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0f00: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0f10: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0f20: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0f30: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0f40: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0f50: 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66  PAGER_SHARED bef
0f60: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0f70: 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45  ns to PAGER_RESE
0f80: 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72  RVED.).** The tr
0f90: 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45  ansition to PAGE
0fa0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75  R_EXCLUSIVE occu
0fb0: 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61  rs when before a
0fc0: 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ny changes.** ar
0fd0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
0fe0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66  tabase file.  Af
0ff0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61  ter an sqlite3pa
1000: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a  ger_rollback().*
1010: 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65  * or sqlite_page
1020: 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20  r_commit(), the 
1030: 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20  state goes back 
1040: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
1050: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
1060: 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a  R_UNLOCK      0.
1070: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48  #define PAGER_SH
1080: 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a  ARED      1   /*
1090: 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f   same as SHARED_
10a0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
10b0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20  PAGER_RESERVED  
10c0: 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    2   /* same as
10d0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a   RESERVED_LOCK *
10e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
10f0: 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20  EXCLUSIVE   4   
1100: 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55  /* same as EXCLU
1110: 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  SIVE_LOCK */.#de
1120: 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45  fine PAGER_SYNCE
1130: 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20  D      5../*.** 
1140: 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  If the SQLITE_BU
1150: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1160: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f   macro is set to
1170: 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65   true at compile
1180: 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66  -time,.** then f
1190: 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74  ailed attempts t
11a0: 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64  o get a reserved
11b0: 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b   lock will invok
11c0: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
11d0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ack..** This is 
11e0: 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20  off by default. 
11f0: 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e   To see why, con
1200: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1210: 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a  ing scenario:.**
1220: 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72   .** Suppose thr
1230: 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61  ead A already ha
1240: 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
1250: 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65  and wants a rese
1260: 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68  rved lock..** Th
1270: 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68  read B already h
1280: 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  as a reserved lo
1290: 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20  ck and wants an 
12a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
12b0: 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65   If.** both thre
12c0: 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68  ads are using th
12d0: 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63  eir busy callbac
12e0: 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ks, it might be 
12f0: 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62  a long time.** b
1300: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
1310: 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70   threads give up
1320: 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20   and allows the 
1330: 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64  other to proceed
1340: 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
1350: 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f  thread trying to
1360: 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65   get the reserve
1370: 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20  d lock gives up 
1380: 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69  quickly.** (if i
1390: 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20  t never invokes 
13a0: 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63  its busy callbac
13b0: 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  k) then the cont
13c0: 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a  ention will be.*
13d0: 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b  * resolved quick
13e0: 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ly..*/.#ifndef S
13f0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1400: 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  VED_LOCK.# defin
1410: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
1420: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65  SERVED_LOCK 0.#e
1430: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1440: 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61   macro rounds va
1450: 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20  lues up so that 
1460: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1470: 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a  an address it.**
1480: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1490: 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20  o be an address 
14a0: 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20  that is aligned 
14b0: 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  to an 8-byte bou
14c0: 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ndary..*/.#defin
14d0: 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  e FORCE_ALIGNMEN
14e0: 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26  T(X)   (((X)+7)&
14f0: 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ~7)../*.** Each 
1500: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  in-memory image 
1510: 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73  of a page begins
1520: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
1530: 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54  ing header..** T
1540: 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e  his header is on
1550: 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68  ly visible to th
1560: 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e  is pager module.
1570: 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20    The client.** 
1580: 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20  code that calls 
1590: 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20  pager sees only 
15a0: 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  the data that fo
15b0: 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72  llows the header
15c0: 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63  ..**.** Client c
15d0: 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  ode should call 
15e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
15f0: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1600: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1610: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1620: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1630: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1640: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  e sqlite3pager_w
1650: 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c  rite().** is cal
1660: 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  led, the origina
1670: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
1680: 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1690: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a   the rollback.**
16a0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48   journal and PgH
16b0: 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64  dr.inJournal and
16c0: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
16d0: 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c  are set.  Later,
16e0: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75   once.** the jou
16f0: 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61  rnal page has ma
1700: 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64  de it onto the d
1710: 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48  isk surface, PgH
1720: 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69  dr.needSync.** i
1730: 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20  s cleared.  The 
1740: 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61  modified page ca
1750: 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20  nnot be written 
1760: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72  back into the or
1770: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1780: 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  se file until th
1790: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20  e journal pages 
17a0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
17b0: 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a  to disk and the.
17c0: 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  ** PgHdr.needSyn
17d0: 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  c has been clear
17e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67  ed..**.** The Pg
17f0: 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69  Hdr.dirty flag i
1800: 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74  s set when sqlit
1810: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1820: 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a  is called and.**
1830: 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69   is cleared agai
1840: 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  n when the page 
1850: 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74  content is writt
1860: 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f  en back to the o
1870: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
1880: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70  ase file..*/.typ
1890: 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64  edef struct PgHd
18a0: 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20  r PgHdr;.struct 
18b0: 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20  PgHdr {.  Pager 
18c0: 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74  pager to which t
18f0: 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73  his page belongs
1900: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1930: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
1940: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
1950: 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50   *pNextHash, *pP
1960: 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73  revHash;  /* Has
1970: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
1980: 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f  n for PgHdr.pgno
1990: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19a0: 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72  xtFree, *pPrevFr
19b0: 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74  ee;  /* Freelist
19c0: 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20   of pages where 
19d0: 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  nRef==0 */.  PgH
19e0: 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20  dr *pNextAll;   
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1a00: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
1a10: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
1a20: 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76  NextStmt, *pPrev
1a30: 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f  Stmt;  /* List o
1a40: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
1a50: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1a60: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1a70: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1a80: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1a90: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1aa0: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1ab0: 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20   u8 inStmt;     
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68  /* TRUE if in th
1ae0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
1af0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
1b00: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b20: 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  UE if we need to
1b30: 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e   write back chan
1b40: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ges */.  u8 need
1b50: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20          /* Sync 
1b70: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77  journal before w
1b80: 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65  riting this page
1b90: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
1ba0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
1bb0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
1bc0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1bd0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1be0: 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65  .  short int nRe
1bf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1c00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
1c10: 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67  sers of this pag
1c20: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44  e */.  PgHdr *pD
1c30: 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  irty;           
1c40: 20 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70        /* Dirty p
1c50: 61 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50  ages sorted by P
1c60: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66  gHdr.pgno */.#if
1c70: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1c80: 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67  _PAGES.  u32 pag
1c90: 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20  eHash;.#endif.  
1ca0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /* pPager->pageS
1cb0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67  ize bytes of pag
1cc0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
1cd0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1ce0: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1cf0: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1d00: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1d10: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1d20: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1d30: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1d40: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1d50: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1d60: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1d70: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
1d80: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
1d90: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1da0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
1db0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
1dc0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1dd0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1de0: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1df0: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1e00: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1e10: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1e20: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e30: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1e40: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e50: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1e60: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1e70: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
1e80: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
1e90: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
1ea0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
1eb0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
1ec0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
1ed0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1ee0: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1ef0: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1f00: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1f10: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1f20: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1f30: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1f40: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1f50: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1f60: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1f70: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
1f80: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
1f90: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
1fa0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
1fb0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
1fc0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
1fd0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
1fe0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
1ff0: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
2000: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2010: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2020: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
2030: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
2040: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
2050: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
2060: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
2070: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
2080: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
2090: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  DEC(P,D,N,X) if(
20a0: 20 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d   P->xCodec ){ P-
20b0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
20c0: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
20d0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f  else.# define CO
20e0: 44 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e  DEC(P,D,N,X).#en
20f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2100: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2110: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2120: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2130: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2140: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2150: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2160: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2170: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2180: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
2190: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
21a0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
21b0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
21c0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
21d0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
21e0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
21f0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2200: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2210: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2220: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2230: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2240: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2250: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2260: 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65   How big to make
2270: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2280: 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e  used for locatin
2290: 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  g in-memory page
22a0: 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d  s.** by page num
22b0: 62 65 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20  ber. This macro 
22c0: 6c 6f 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73  looks a little s
22d0: 69 6c 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61  illy, but is eva
22e0: 6c 75 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d  luated.** at com
22f0: 70 69 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72  pile-time, not r
2300: 75 6e 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73  un-time (at leas
2310: 74 20 66 6f 72 20 67 63 63 20 74 68 69 73 20 69  t for gcc this i
2320: 73 20 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66  s true)..*/.#def
2330: 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c  ine N_PG_HASH (\
2340: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30  .  (MAX_PAGES>10
2350: 32 34 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d  24)?2048: \.  (M
2360: 41 58 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30  AX_PAGES>512)?10
2370: 32 34 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  24: \.  (MAX_PAG
2380: 45 53 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20  ES>256)?512: \. 
2390: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29   (MAX_PAGES>128)
23a0: 3f 32 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50  ?256: \.  (MAX_P
23b0: 41 47 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20  AGES>64)?128:64 
23c0: 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20  \.)../*.** Hash 
23d0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f  a page number.*/
23e0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68  .#define pager_h
23f0: 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28  ash(PN)  ((PN)&(
2400: 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f  N_PG_HASH-1))../
2410: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
2420: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
2430: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2440: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2450: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
2460: 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c  r {.  u8 journal
2470: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2480: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
2490: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
24a0: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
24b0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
24c0: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
24d0: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
24e0: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
24f0: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
2500: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
2510: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
2520: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2530: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
2540: 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63  /.  u8 noReadloc
2550: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2560: 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
2570: 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c   to obtain readl
2580: 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d  ocks */.  u8 stm
2590: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
25a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
25c0: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
25d0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
25e0: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
25f0: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
2600: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
2610: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
2620: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
2630: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
2640: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
2650: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
2660: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
2670: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
26a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
26b0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
26c0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
26d0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
26e0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
26f0: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
2700: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74  tness */.  u8 st
2710: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2720: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2730: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2740: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2750: 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b   */.  u8 errMask
2760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2770: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65    /* One of seve
2780: 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72  ral kinds of err
2790: 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ors */.  u8 temp
27a0: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
27b0: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
27c0: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
27d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
27e0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
27f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2800: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
2810: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
2820: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2830: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2840: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2850: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2860: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2870: 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20  dirtyCache;     
2880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2890: 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73   if cached pages
28a0: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f   have changed */
28b0: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
28c0: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
28d0: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
28e0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
28f0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
2900: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2920: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
2930: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
2940: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
2950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2960: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
2970: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2980: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e   to jrnl */.  in
2990: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
29a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
29c0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
29d0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
29e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
29f0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
2a00: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
2a10: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a30: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2a40: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
2a50: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2a60: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2a90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2aa0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
2ab0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
2ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
2ad0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
2ae0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
2af0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74  hecksum */.  int
2b00: 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20   stmtNRec;      
2b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b20: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
2b30: 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c   stmt subjournal
2b40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b60: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
2b70: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
2b80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2b90: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
2ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2bb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2bc0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
2bd0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2c00: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2c10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50  s */.  int nMaxP
2c20: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2c30: 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72     /* High water
2c40: 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a   mark of nPage *
2c50: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
2c80: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
2c90: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
2ca0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2cd0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2ce0: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2cf0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d10: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2d20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2d30: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2d40: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2d60: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2d70: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2d80: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
2d90: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
2da0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2db0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2dc0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
2dd0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2de0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2df0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
2e10: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
2e20: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
2e30: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
2e40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2e50: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a  .  OsFile *fd, *
2e60: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  jfd;           /
2e70: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2e80: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
2e90: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
2ea0: 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20   OsFile *stfd;  
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2ed0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
2ee0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
2ef0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
2f00: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
2f10: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2f20: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
2f30: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
2f40: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
2f50: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
2f60: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
2f70: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
2f80: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
2f90: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
2fa0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
2fb0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
2fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fd0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
2fe0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2ff0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
3000: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3010: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
3020: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
3030: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
3040: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
3050: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3060: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
3070: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3080: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
3090: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
30a0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
30b0: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
30c0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
30d0: 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20  i64 stmtHdrOff; 
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30f0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
3100: 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73  der written this
3110: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3120: 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20  i64 stmtCksum;  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
3140: 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74  ksumInit when st
3150: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
3160: 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ted */.  i64 stm
3170: 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  tJSize;         
3180: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3190: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
31a0: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
31b0: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
31c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
31d0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
31e0: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
31f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3200: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
3210: 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20  , nMiss, nOvfl; 
3220: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
3230: 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20  s, missing, and 
3240: 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  LRU overflows */
3250: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72  .  int nRead,nWr
3260: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ite;           /
3270: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
3280: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
3290: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
32a0: 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f  *xDestructor)(vo
32b0: 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c  id*,int); /* Cal
32c0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
32d0: 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65  hen freeing page
32e0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  s */.  void (*xR
32f0: 65 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69  einiter)(void*,i
3300: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
3310: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3320: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
3330: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
3340: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
3350: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
3360: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
3370: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
3380: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
3390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
33a0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
33b0: 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20  o xCodec() */.  
33c0: 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50  PgHdr *aHash[N_P
33d0: 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48  G_HASH];    /* H
33e0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
33f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
3400: 50 67 48 64 72 20 2a 2f 0a 23 69 66 6e 64 65 66  PgHdr */.#ifndef
3410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3420: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
3430: 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20   Pager *pNext;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3450: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  Linked list of p
3460: 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68  agers in this th
3470: 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  read */.#endif.}
3480: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  ;../*.** If SQLI
3490: 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e  TE_TEST is defin
34a0: 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  ed then incremen
34b0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67  t the variable g
34c0: 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61  iven in.** the a
34d0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65  rgument.*/.#ifde
34e0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20  f SQLITE_TEST.# 
34f0: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
3500: 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23  (x)  x++.#else.#
3510: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3520: 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  R(x).#endif../*.
3530: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69 74  ** These are bit
3540: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 65  s that can be se
3550: 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  t in Pager.errMa
3560: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  sk..**.** TODO: 
3570: 4d 61 79 62 65 20 77 65 20 6a 75 73 74 20 77 61  Maybe we just wa
3580: 6e 74 20 61 20 76 61 72 69 61 62 6c 65 20 2d 20  nt a variable - 
3590: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 43  Pager.errCode. C
35a0: 61 6e 20 77 65 20 72 65 61 6c 6c 79 20 0a 2a 2a  an we really .**
35b0: 20 20 20 20 20 20 20 68 61 76 65 20 74 77 6f 20         have two 
35c0: 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 65 72 72  simultaneous err
35d0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 3f 0a 2a  or conditions?.*
35e0: 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 69 6e 67 20  *.** Recovering 
35f0: 66 72 6f 6d 20 61 6e 20 53 51 4c 49 54 45 5f 46  from an SQLITE_F
3600: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ULL, SQLITE_LOCK
3610: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
3620: 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   or .** SQLITE_I
3630: 4f 45 52 52 20 65 72 72 6f 72 20 69 73 20 6e 6f  OERR error is no
3640: 74 20 61 20 73 69 6d 70 6c 65 20 6d 61 74 74 65  t a simple matte
3650: 72 2c 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20  r, particularly 
3660: 69 66 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a  if the pager .**
3670: 20 63 61 63 68 65 20 69 73 20 73 68 61 72 65 64   cache is shared
3680: 20 62 65 74 77 65 65 6e 20 6d 75 6c 74 69 70 6c   between multipl
3690: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
36a0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  *.** SQLITE_FULL
36b0: 20 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c   (PAGER_ERR_FULL
36c0: 29 3a 0a 2a 2a 20 20 20 20 20 43 6c 65 61 72 65  ):.**     Cleare
36d0: 64 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  d when the trans
36e0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
36f0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   back..**.** SQL
3700: 49 54 45 5f 43 4f 52 52 55 50 54 20 28 50 41 47  ITE_CORRUPT (PAG
3710: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 29 3a  ER_ERR_CORRUPT):
3720: 0a 2a 2a 20 20 20 20 20 43 61 6e 6e 6f 74 20 62  .**     Cannot b
3730: 65 20 63 6c 65 61 72 65 64 2e 20 54 68 65 20 75  e cleared. The u
3740: 70 70 65 72 20 6c 61 79 65 72 20 6d 75 73 74 20  pper layer must 
3750: 63 6c 6f 73 65 20 74 68 65 20 63 75 72 72 65 6e  close the curren
3760: 74 20 70 61 67 65 72 20 0a 2a 2a 20 20 20 20 20  t pager .**     
3770: 61 6e 64 20 6f 70 65 6e 20 61 20 6e 65 77 20 6f  and open a new o
3780: 6e 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  ne on the same f
3790: 69 6c 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ile to continue.
37a0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 50 52  .**.** SQLITE_PR
37b0: 4f 54 4f 43 4f 4c 20 28 50 41 47 45 52 5f 45 52  OTOCOL (PAGER_ER
37c0: 52 5f 4c 4f 43 4b 29 3a 0a 2a 2a 20 20 20 20 20  R_LOCK):.**     
37d0: 54 68 69 73 20 65 72 72 6f 72 20 6f 6e 6c 79 20  This error only 
37e0: 6f 63 63 75 72 73 20 69 66 20 61 6e 20 69 6e 74  occurs if an int
37f0: 65 72 6e 61 6c 20 65 72 72 6f 72 20 6f 63 63 75  ernal error occu
3800: 72 73 20 6f 72 20 61 6e 6f 74 68 65 72 20 70 72  rs or another pr
3810: 6f 63 65 73 73 20 0a 2a 2a 20 20 20 20 20 69 73  ocess .**     is
3820: 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   not following t
3830: 68 65 20 73 71 6c 69 74 65 20 6c 6f 63 6b 69 6e  he sqlite lockin
3840: 67 20 70 72 6f 74 6f 63 6f 6c 20 28 69 2e 65 2e  g protocol (i.e.
3850: 20 73 6f 6d 65 6f 6e 65 20 69 73 20 0a 2a 2a 20   someone is .** 
3860: 20 20 20 20 6d 61 6e 69 70 75 6c 61 74 69 6e 67      manipulating
3870: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3880: 6c 65 20 75 73 69 6e 67 20 73 6f 6d 65 74 68 69  le using somethi
3890: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 73 71  ng other than sq
38a0: 6c 69 74 65 29 2e 0a 2a 2a 20 20 20 20 20 54 68  lite)..**     Th
38b0: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  is is handled in
38c0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
38d0: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
38e0: 74 69 6f 6e 20 2d 20 74 68 65 20 65 72 72 6f 72  tion - the error
38f0: 20 0a 2a 2a 20 20 20 20 20 63 61 6e 6e 6f 74 20   .**     cannot 
3900: 62 65 20 63 6c 65 61 72 65 64 20 65 78 63 65 70  be cleared excep
3910: 74 20 62 79 20 63 6c 6f 73 69 6e 67 20 74 68 65  t by closing the
3920: 20 63 75 72 72 65 6e 74 20 70 61 67 65 72 20 61   current pager a
3930: 6e 64 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 20  nd opening .**  
3940: 20 20 20 61 20 62 72 61 6e 64 20 6e 65 77 20 6f     a brand new o
3950: 6e 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  ne on the same f
3960: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
3970: 45 5f 49 4f 45 52 52 20 28 50 41 47 45 52 5f 45  E_IOERR (PAGER_E
3980: 52 52 5f 44 49 53 4b 29 3a 0a 2a 2a 20 20 20 20  RR_DISK):.**    
3990: 20 43 6c 65 61 72 65 64 20 77 68 65 6e 20 74 68   Cleared when th
39a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
39b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
39c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
39d0: 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31  RR_FULL     0x01
39e0: 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66    /* a write() f
39f0: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
3a00: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20   PAGER_ERR_LOCK 
3a10: 20 20 20 20 30 78 30 32 20 20 2f 2a 20 65 72 72      0x02  /* err
3a20: 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  or in the lockin
3a30: 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64  g protocol */.#d
3a40: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3a50: 43 4f 52 52 55 50 54 20 20 30 78 30 34 20 20 2f  CORRUPT  0x04  /
3a60: 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f  * database or jo
3a70: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
3a80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
3a90: 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30  R_ERR_DISK     0
3aa0: 78 30 38 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20  x08  /* general 
3ab0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d  disk I/O error -
3ac0: 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65 3f   bad hard drive?
3ad0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e   */../*.** Journ
3ae0: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3af0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
3b00: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
3b10: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
3b20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
3b30: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
3b40: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
3b50: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
3b60: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
3b70: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
3b80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3b90: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3ba0: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3bb0: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3bc0: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3bd0: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3be0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3bf0: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3c00: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3c10: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3c20: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3c30: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
3c40: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
3c50: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3c60: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3c70: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
3c80: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3c90: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3ca0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3cb0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3cc0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3cd0: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3ce0: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3cf0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3d00: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3d10: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3d20: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3d30: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3d40: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3d50: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3d60: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3d70: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3d80: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3d90: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3da0: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3db0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3dc0: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3dd0: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3de0: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3df0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3e00: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3e10: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3e20: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3e30: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3e40: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3e50: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3e60: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3e70: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3e80: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3e90: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3ea0: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3eb0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3ec0: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3ed0: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3ee0: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3ef0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3f00: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3f10: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3f20: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3f30: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3f40: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3f50: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3f60: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3f70: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3f80: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3f90: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3fa0: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3fb0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3fc0: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3fd0: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3fe0: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3ff0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4000: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
4010: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
4020: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
4030: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
4040: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
4050: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
4060: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
4070: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
4080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
4090: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
40a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
40b0: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
40c0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
40d0: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
40e0: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
40f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
4100: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
4110: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
4120: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
4130: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
4140: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
4150: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
4160: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
4170: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
4180: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
4190: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
41a0: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
41b0: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
41c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
41d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
41e0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
41f0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
4200: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
4210: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
4220: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
4230: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
4240: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
4250: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4260: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4270: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4280: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4290: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
42a0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
42b0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
42c0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
42d0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
42e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
42f0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
4300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
4310: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
4320: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
4330: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
4340: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
4350: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
4360: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66   default size of
4370: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a   a disk sector.*
4380: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
4390: 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a  SECTOR_SIZE 512.
43a0: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
43b0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
43c0: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
43d0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
43e0: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
43f0: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
4400: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
4410: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
4420: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
4430: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
4440: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
4450: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
4460: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
4470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
4480: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
4490: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
44a0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
44b0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
44c0: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
44d0: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
44e0: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
44f0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
4500: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
4510: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
4520: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4530: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
4540: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
4550: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
4560: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
4570: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
4580: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
4590: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
45a0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
45b0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
45c0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
45d0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
45e0: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
45f0: 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  Enable reference
4600: 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20   count tracking 
4610: 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20  (for debugging) 
4620: 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20  here:.*/.#ifdef 
4630: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
4640: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
4650: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
4660: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
4670: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
4680: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
4690: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
46a0: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
46b0: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
46c0: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
46d0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
46e0: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
46f0: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
4700: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
4710: 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
4720: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a  ATA(p), p->nRef.
4730: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
4740: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
4750: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
4760: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
4770: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4780: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
4790: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
47a0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
47b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
47c0: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
47d0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
47e0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
47f0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
4800: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
4810: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
4820: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4830: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
4840: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
4850: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4860: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4870: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
4880: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
4890: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
48a0: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
48b0: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
48c0: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
48d0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20 72   *pRes){.  u32 r
48e0: 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  es;.  int rc;.  
48f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
4900: 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a  ad(fd, &res, siz
4910: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28  eof(res));.  if(
4920: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4930: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
4940: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d  har ac[4];.    m
4950: 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20  emcpy(ac, &res, 
4960: 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61  4);.    res = (a
4970: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
4980: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
4990: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20  <<8) | ac[3];.  
49a0: 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b  }.  *pRes = res;
49b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
49c0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
49d0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
49e0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
49f0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
4a00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
4a10: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
4a20: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
4a30: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4a40: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
4a50: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
4a60: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
4a70: 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e  2 val){.  unsign
4a80: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4a90: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
4aa0: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  4) & 0xff;.  ac[
4ab0: 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  1] = (val>>16) &
4ac0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d   0xff;.  ac[2] =
4ad0: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
4ae0: 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20  ;.  ac[3] = val 
4af0: 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e  & 0xff;.  return
4b00: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
4b10: 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f  fd, ac, 4);.}../
4b20: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 33  *.** Write the 3
4b30: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 27 76  2-bit integer 'v
4b40: 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70 61 67  al' into the pag
4b50: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
4b60: 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a 20 27  page header.** '
4b70: 70 27 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  p' at offset 'of
4b80: 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  fset'..*/.static
4b90: 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74   void store32bit
4ba0: 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72  s(u32 val, PgHdr
4bb0: 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29   *p, int offset)
4bc0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4bd0: 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28  r *ac;.  ac = &(
4be0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
4bf0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4c00: 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63 5b  )[offset];.  ac[
4c10: 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26  0] = (val>>24) &
4c20: 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d   0xff;.  ac[1] =
4c30: 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66   (val>>16) & 0xf
4c40: 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61  f;.  ac[2] = (va
4c50: 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20  l>>8) & 0xff;.  
4c60: 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78  ac[3] = val & 0x
4c70: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ff;.}../*.** Rea
4c80: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
4c90: 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  er at offset 'of
4ca0: 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70  fset' from the p
4cb0: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
4cc0: 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72  y.** page header
4cd0: 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   'p'..*/.static 
4ce0: 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62 69  u32 retrieve32bi
4cf0: 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74  ts(PgHdr *p, int
4d00: 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69   offset){.  unsi
4d10: 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20  gned char *ac;. 
4d20: 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65   ac = &((unsigne
4d30: 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  d char*)PGHDR_TO
4d40: 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74  _DATA(p))[offset
4d50: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b  ];.  return (ac[
4d60: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
4d70: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
4d80: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a  8) | ac[3];.}...
4d90: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
4da0: 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50  e bits in the pP
4db0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e  ager->errMask in
4dc0: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65  to an approprate
4dd0: 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  .** return code.
4de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4df0: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67  ager_errcode(Pag
4e00: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
4e10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4e20: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
4e30: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4e40: 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72  _ERR_LOCK )    r
4e50: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
4e60: 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  COL;.  if( pPage
4e70: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
4e80: 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20  ER_ERR_DISK )   
4e90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
4ea0: 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  RR;.  if( pPager
4eb0: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4ec0: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20  R_ERR_FULL )    
4ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
4ee0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4ef0: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
4f00: 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63  ERR_CORRUPT ) rc
4f10: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
4f20: 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  T;.  return rc;.
4f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4f40: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
4f50: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
4f60: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
4f70: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
4f80: 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65   code to set the
4f90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 69 74   appropriate bit
4fa0: 73 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d 61  s in Pager.errMa
4fb0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
4fc0: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
4fd0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
4fe0: 20 72 63 29 7b 0a 20 20 73 77 69 74 63 68 28 20   rc){.  switch( 
4ff0: 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  rc ){.    case S
5000: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 0a  QLITE_PROTOCOL:.
5010: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
5020: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
5030: 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 62  RR_LOCK;.      b
5040: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
5050: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 0a 20 20 20  QLITE_IOERR:.   
5060: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
5070: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
5080: 44 49 53 4b 3b 0a 20 20 20 20 20 20 62 72 65 61  DISK;.      brea
5090: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
50a0: 54 45 5f 46 55 4c 4c 3a 0a 20 20 20 20 20 20 70  TE_FULL:.      p
50b0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
50c0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
50d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
50e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
50f0: 4f 52 52 55 50 54 3a 0a 20 20 20 20 20 20 70 50  ORRUPT:.      pP
5100: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
5110: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
5120: 50 54 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  PT;.      break;
5130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5140: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5150: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
5160: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
5170: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
5180: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
5190: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
51a0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
51b0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
51c0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
51d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
51e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
51f0: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
5200: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
5210: 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72  TA(pPage);.  for
5220: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70  (i=0; i<pPage->p
5230: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
5240: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
5250: 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61  = (hash+i)^pData
5260: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
5270: 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n hash;.}../*.**
5280: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
5290: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
52a0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
52b0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
52c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
52d0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
52e0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
52f0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5300: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5310: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5320: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
5330: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
5340: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
5350: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
5360: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5370: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
5380: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
5390: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
53a0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
53b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
53c0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
53d0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
53e0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  | pPager->errMas
53f0: 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50  k || MEMDB || pP
5400: 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20  g->dirty || .   
5410: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
5420: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
5430: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
5440: 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  e.#define CHECK_
5450: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a  PAGE(x).#endif..
5460: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
5470: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
5480: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
5490: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
54a0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
54b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
54c0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
54d0: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
54e0: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
54f0: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
5500: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5510: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5520: 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69  c(). *pzMaster i
5530: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e  s.** set to poin
5540: 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  t at the memory 
5550: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
5560: 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
5570: 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74  er must.** sqlit
5580: 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65  eFree() *pzMaste
5590: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  r..**.** If no m
55a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
55b0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
55c0: 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20  nt *pzMaster is 
55d0: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
55e0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
55f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
5600: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
5610: 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e  nal(OsFile *pJrn
5620: 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74  l, char **pzMast
5630: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
5640: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20   u32 len;.  i64 
5650: 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  szJ;.  u32 cksum
5660: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
5670: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
5680: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
5690: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
56a0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
56b0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
56c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
56d0: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
56e0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
56f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
5700: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
5710: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5720: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
5730: 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72  szJ-16);.  if( r
5740: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5750: 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63  eturn rc;. .  rc
5760: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5770: 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  rnl, &len);.  if
5780: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5790: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
57a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
57b0: 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a  pJrnl, &cksum);.
57c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
57d0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
57e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
57f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
5800: 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20  agic, 8);.  if( 
5810: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5820: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5830: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5840: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5860: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5870: 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  16-len);.  if( r
5880: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5890: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a  eturn rc;..  *pz
58a0: 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a  Master = (char *
58b0: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65  )sqliteMalloc(le
58c0: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
58d0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
58e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
58f0: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
5900: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
5910: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
5920: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5930: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5940: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5950: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5960: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ter = 0;.    ret
5970: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
5980: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
5990: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
59a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
59b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
59c0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
59d0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a  .    cksum -= (*
59e0: 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20  pzMaster)[i];.  
59f0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
5a00: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
5a10: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
5a20: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
5a30: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
5a40: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
5a50: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
5a60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5a70: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
5a80: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
5a90: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
5aa0: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
5ab0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
5ac0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
5ad0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
5ae0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
5af0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
5b00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72   */.    sqliteFr
5b10: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
5b20: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
5b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
5b40: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
5b50: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
5b60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5b70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
5b80: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
5b90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
5ba0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
5bb0: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
5bc0: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
5bd0: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
5be0: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
5bf0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
5c00: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
5c10: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
5c20: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
5c30: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
5c40: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
5c50: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
5c60: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
5c70: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ca0: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5cc0: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5ce0: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5d00: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
5d30: 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e  ic int seekJourn
5d40: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
5d50: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
5d60: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
5d70: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5d80: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
5d90: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
5da0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
5db0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
5dc0: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
5dd0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
5de0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
5df0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5e00: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
5e10: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
5e30: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
5e40: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5e50: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
5e60: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
5e70: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
5e80: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
5e90: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
5ea0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a  urnalOff);.}../*
5eb0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5ec0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
5ed0: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
5ee0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
5ef0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
5f00: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
5f10: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
5f20: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
5f30: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
5f40: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
5f50: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
5f60: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
5f70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
5f80: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
5f90: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
5fa0: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
5fb0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
5fc0: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
5fd0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
5fe0: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
5ff0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
6000: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
6010: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
6020: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
6030: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
6040: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
6050: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
6060: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
6070: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
6080: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6090: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
60a0: 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  rnal..** .** Fol
60b0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
60c0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62  L_HDR_SZ - 24) b
60d0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
60e0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
60f0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
6100: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
6110: 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20  r){..  int rc = 
6120: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6130: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
6140: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6150: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6160: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
6170: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
6180: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
6190: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ff==0 ){.    pPa
61a0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
61b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
61c0: 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67  lHdr;.  }.  pPag
61d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
61e0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
61f0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
6200: 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20  FIX ME: .  **.  
6210: 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20  ** Possibly for 
6220: 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e  a pager not in n
6230: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  o-sync mode, the
6240: 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73   journal magic s
6250: 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  hould not.  ** b
6260: 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20  e written until 
6270: 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69  nRec is filled i
6280: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78  n as part of nex
6290: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e  t syncJournal().
62a0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75   .  **.  ** Actu
62b0: 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77  ally maybe the w
62c0: 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  hole journal hea
62d0: 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65  der should be de
62e0: 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74  layed until that
62f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69  .  ** point. Thi
6300: 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20  nk about this.. 
6310: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
6320: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6330: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
6340: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
6350: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
6360: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6370: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
6380: 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46   nRec Field. 0xF
6390: 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73  FFFFFFF for no-s
63a0: 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ync journals. */
63b0: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
63c0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
63d0: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  d, pPager->noSyn
63e0: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
63f0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
6400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6410: 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f      /* The rando
6420: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6430: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20  tialiser */ .   
6440: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
6450: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
6460: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
6470: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6480: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  );.    rc = writ
6490: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
64a0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  jfd, pPager->cks
64b0: 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69  umInit);.  }.  i
64c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
64d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69   ){.    /* The i
64e0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
64f0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  size */.    rc =
6500: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
6510: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
6520: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ->dbSize);.  }. 
6530: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6540: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
6550: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
6560: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
6570: 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20  ocess */.    rc 
6580: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
6590: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
65a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
65b0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f    }..  /* The jo
65c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
65d0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75   been written su
65e0: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b  ccessfully. Seek
65f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
6600: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
6610: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
6620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6630: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a  er sector..  */.
6640: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6650: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6660: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
6670: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6680: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
6690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
66a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
66b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
66c0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
66d0: 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20  , "\000", 1);.  
66e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
66f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
6710: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
6720: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
6730: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
6740: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
6750: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
6760: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
6770: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
6780: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
6790: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
67a0: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
67b0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
67c0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
67d0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
67e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
67f0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
6800: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
6810: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
6820: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
6830: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6840: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
6850: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
6860: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
6870: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6880: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
6890: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
68a0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
68b0: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
68c0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
68d0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
68e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
68f0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
6900: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
6910: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
6920: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
6930: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
6940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6950: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
6960: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
6970: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
6980: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
6990: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
69a0: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
69b0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
69c0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
69d0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
69e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
69f0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
6a00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
6a10: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
6a20: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
6a30: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
6a40: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
6a50: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
6a60: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
6a70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
6a80: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6a90: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
6aa0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
6ab0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
6ac0: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
6ad0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
6ae0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6af0: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
6b00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
6b10: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6b20: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
6b30: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6b40: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
6b50: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6b60: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
6b70: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
6b80: 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69  of(aMagic));.  i
6b90: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6ba0: 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  c;..  if( memcmp
6bb0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6bc0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6bd0: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
6be0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6bf0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
6c00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6c10: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
6c20: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6c30: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6c40: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6c50: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
6c60: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
6c70: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6c80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
6c90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6ca0: 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  d, pDbSize);.  i
6cb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6cc0: 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  c;..  /* Update 
6cd0: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
6ce0: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
6cf0: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
6d00: 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f  by .  ** the pro
6d10: 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
6d20: 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
6d30: 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
6d40: 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  was.  ** created
6d50: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
6d60: 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
6d70: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
6d80: 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69  tine.  ** is bei
6d90: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
6da0: 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  ithin pager_play
6db0: 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61  back(). The loca
6dc0: 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  l value.  ** of 
6dd0: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
6de0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
6df0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
6e00: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
6e10: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6e20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
6e30: 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63  2 *)&pPager->sec
6e40: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
6e50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6e60: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6e70: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
6e80: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
6e90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6ea0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
6eb0: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6ec0: 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  alOff);.  return
6ed0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
6ee0: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
6ef0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
6f00: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
6f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
6f20: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
6f30: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
6f40: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
6f50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6f60: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
6f70: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
6f80: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
6f90: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
6fa0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
6fb0: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
6fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
6fd0: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
6fe0: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
6ff0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
7000: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
7010: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
7020: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
7030: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
7040: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
7050: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
7060: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
7070: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
7080: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
7090: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
70a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
70b0: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
70c0: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
70d0: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
70e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
70f0: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
7100: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
7110: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
7120: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
7130: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
7140: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
7150: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
7160: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
7170: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
7180: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
7190: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
71a0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
71b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
71c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
71d0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
71e0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
71f0: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
7200: 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ; .  u32 cksum =
7210: 20 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61   0; ..  if( !zMa
7220: 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ster || pPager->
7230: 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72  setMaster) retur
7240: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
7250: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
7260: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
7270: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a  trlen(zMaster);.
7280: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
7290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
72a0: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m += zMaster[i];
72b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
72c0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
72d0: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
72e0: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
72f0: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
7300: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
7310: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
7320: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
7330: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
7340: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
7350: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
7360: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
7370: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
7380: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
7390: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65   ){.    rc = see
73a0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
73b0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
73c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
73d0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
73e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
73f0: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
7400: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
7410: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50  s(pPager->jfd, P
7420: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
7430: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ger));.  if( rc!
7440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7450: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
7460: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7470: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
7480: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
7490: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
74b0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
74c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e  pPager->jfd, len
74d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
74e0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
74f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  rc;..  rc = writ
7500: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
7510: 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69  jfd, cksum);.  i
7520: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7530: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
7550: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
7560: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7570: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7580: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
7590: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
75a0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
75b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
75c0: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
75d0: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
75e0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
75f0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7600: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7610: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7620: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7630: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7640: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
7650: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
7660: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
7670: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
7680: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
7690: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
76a0: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
76b0: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
76c0: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
76d0: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
76e0: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
76f0: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
7700: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7710: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
7720: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
7730: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
7740: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
7750: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
7760: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
7770: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
7780: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
7790: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
77a0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
77b0: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
77c0: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
77d0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
77e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
77f0: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
7800: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7810: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
7820: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7830: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7840: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7850: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
7860: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
7870: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
7880: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
7890: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
78a0: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
78b0: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
78c0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
78d0: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
78e0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
78f0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
7900: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7910: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
7920: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
7930: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
7940: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7950: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
7960: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
7970: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7980: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7990: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
79a0: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
79b0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
79c0: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
79d0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
79e0: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
79f0: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
7a00: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7a10: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
7a20: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
7a30: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
7a40: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
7a50: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
7a60: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
7a70: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
7a80: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
7a90: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7aa0: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
7ab0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7ac0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7ad0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7ae0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7af0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7b00: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
7b10: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
7b20: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
7b30: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
7b40: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7b50: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
7b60: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7b70: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
7b80: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
7b90: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
7ba0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
7bb0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7bc0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7bd0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7be0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
7bf0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
7c00: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
7c10: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
7c20: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
7c30: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
7c40: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7c50: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
7c60: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
7c70: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
7c80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7c90: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
7ca0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7cb0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
7cc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
7cd0: 72 4d 61 73 6b 20 29 20 72 65 74 75 72 6e 3b 0a  rMask ) return;.
7ce0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7cf0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7d00: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
7d10: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
7d20: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
7d30: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
7d40: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7d50: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
7d60: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
7d70: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
7d80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
7d90: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
7da0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
7db0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
7dc0: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
7dd0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7de0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7df0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7e00: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7e10: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7e20: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7e30: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7e40: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7e50: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
7e60: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
7e70: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
7e80: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
7e90: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
7ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7ec0: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7ed0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7ee0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7ef0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7f00: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7f10: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7f20: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7f30: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7f40: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7f50: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7f60: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7f70: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7f80: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7f90: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7fa0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7fb0: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7fc0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7fd0: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7fe0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7ff0: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
8000: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
8010: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
8020: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
8030: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
8040: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
8050: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
8060: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
8070: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
8080: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8090: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
80a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
80b0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
80c0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
80d0: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
80e0: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
80f0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
8100: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8110: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
8120: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
8130: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
8140: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
8150: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
8160: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
8170: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
8180: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
8190: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
81a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
81b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
81c0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
81d0: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
81e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
81f0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
8200: 2e 78 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  .xDelete(pPager-
8210: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
8220: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
8230: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
8240: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
8250: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8260: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
8270: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
8280: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
8290: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
82a0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
82b0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
82c0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
82d0: 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  Sync = 0;.#ifdef
82e0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
82f0: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
8300: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
8310: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
8320: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
8330: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8340: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
8350: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
8360: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8370: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
8380: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
8390: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
83a0: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
83b0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
83c0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
83d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
83e0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
83f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
8400: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
8410: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
8420: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8430: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
8440: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
8450: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8460: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
8470: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
8480: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
8490: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
84a0: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
84b0: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
84c0: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
84d0: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
84e0: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
84f0: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
8500: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
8510: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
8520: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
8530: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
8540: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
8550: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
8560: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
8570: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
8580: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
8590: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
85a0: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
85b0: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
85c0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
85d0: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
85e0: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
85f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
8600: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
8610: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
8620: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
8630: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
8640: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
8650: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
8660: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
8670: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
8680: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
8690: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
86a0: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
86b0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
86c0: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
86d0: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
86e0: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
86f0: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
8700: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
8710: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
8720: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
8730: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
8740: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
8750: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
8760: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
8770: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
8780: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
8790: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
87a0: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
87b0: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
87c0: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
87d0: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
87e0: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
87f0: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
8800: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
8810: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
8820: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
8830: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
8840: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
8850: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
8860: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
8870: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
8880: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
8890: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
88a0: 67 6e 6f 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  gno, const u8 *a
88b0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
88c0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
88d0: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
88e0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
88f0: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
8900: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
8910: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
8920: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
8930: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
8940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
8950: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
8960: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
8970: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
8980: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
8990: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
89a0: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
89b0: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
89c0: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
89d0: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
89e0: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
89f0: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
8a00: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
8a10: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8a20: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
8a30: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
8a40: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
8a50: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
8a60: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
8a70: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
8a80: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
8a90: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
8aa0: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65  le *jfd, int use
8ab0: 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63  Cksum){.  int rc
8ac0: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
8af0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
8b00: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
8b10: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
8b20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
8b30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
8b40: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
8b50: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
8b80: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
8b90: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44  cking */.  u8 aD
8ba0: 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ata[SQLITE_MAX_P
8bb0: 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54  AGE_SIZE];  /* T
8bc0: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
8bd0: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
8be0: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
8bf0: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
8c00: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
8c10: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
8c20: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8c30: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
8c40: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
8c50: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
8c60: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
8c70: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
8c80: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
8c90: 3e 73 74 66 64 29 20 29 3b 0a 0a 0a 20 20 72 63  >stfd) );...  rc
8ca0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
8cb0: 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  d, &pgno);.  if(
8cc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8cd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
8ce0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8cf0: 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50  (jfd, &aData, pP
8d00: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8d10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8d20: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8d30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
8d40: 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
8d50: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a  ->pageSize + 4;.
8d60: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
8d70: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
8d80: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
8d90: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
8da0: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
8db0: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
8dc0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
8dd0: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
8de0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8df0: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
8e00: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
8e10: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
8e20: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
8e30: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
8e40: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
8e50: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
8e60: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
8e70: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
8e80: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
8e90: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
8ea0: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
8eb0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
8ec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8ed0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
8ee0: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
8ef0: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
8f00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8f10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8f20: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
8f30: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
8f40: 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29  its(jfd, &cksum)
8f50: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
8f60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
8f70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8f80: 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70   += 4;.    if( p
8f90: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
8fa0: 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 21  r, pgno, aData)!
8fb0: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
8fc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
8fd0: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
8fe0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8ff0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
9000: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
9010: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9020: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
9030: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
9040: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
9050: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
9060: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
9070: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
9080: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
9090: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
90a0: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
90b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
90c0: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
90d0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
90e0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
90f0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
9100: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
9110: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
9120: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
9130: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
9140: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
9150: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
9160: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
9170: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
9180: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
9190: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
91a0: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
91b0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
91c0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
91d0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
91e0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
91f0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
9200: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
9210: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
9220: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
9230: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
9240: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
9250: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
9260: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
9270: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
9280: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
9290: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
92a0: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
92b0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
92c0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
92d0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
92e0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
92f0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
9300: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
9310: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
9320: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
9330: 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72  re in the main r
9340: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
9350: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
9360: 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c  , if a full ROLL
9370: 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65  BACK occurs afte
9380: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  r the statement.
9390: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68    ** rollback th
93a0: 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  e full ROLLBACK 
93b0: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65  will not restore
93c0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73   the page to its
93d0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63   original.  ** c
93e0: 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e  ontent.  Two con
93f0: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
9400: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
9410: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
9420: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28  se.  ** files. (
9430: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
9440: 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20  must be locked. 
9450: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
9460: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  t the original. 
9470: 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74   ** page content
9480: 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
9490: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
94a0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
94b0: 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63  is not in.  ** c
94c0: 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20  ache or else it 
94d0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
94e0: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
94f0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9500: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9510: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9520: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9530: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
9540: 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  Pg!=0 );.  TRACE
9550: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9560: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
9570: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
9580: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9590: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
95a0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
95b0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
95c0: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
95d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
95e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
95f0: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9600: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9610: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9620: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9630: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9640: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9650: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9660: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9670: 20 20 69 66 28 20 70 50 67 20 29 20 70 50 67 2d    if( pPg ) pPg-
9680: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
9690: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
96a0: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
96b0: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
96c0: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
96d0: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
96e0: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
96f0: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
9700: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
9710: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
9720: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
9730: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
9740: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
9750: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
9760: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
9770: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
9780: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
9790: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
97a0: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
97b0: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
97c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
97d0: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
97e0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
97f0: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
9800: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
9810: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
9820: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
9830: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
9840: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
9850: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
9860: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9870: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9880: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20  xDestructor ){  
9890: 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68  /*** FIX ME:  Sh
98a0: 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65  ould this be xRe
98b0: 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20  init? ***/.     
98c0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
98d0: 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
98e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
98f0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
9900: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
9910: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
9920: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
9930: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
9940: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
9950: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
9960: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
9970: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9980: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
9990: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
99a0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
99b0: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
99c0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
99d0: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
99e0: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
99f0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
9a00: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
9a10: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
9a20: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
9a30: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
9a40: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
9a50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9a60: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
9a70: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
9a80: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9a90: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
9aa0: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
9ab0: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
9ac0: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
9ad0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9ae0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
9af0: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
9b00: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
9b10: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
9b20: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
9b30: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
9b40: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
9b50: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
9b60: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
9b70: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
9b80: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
9b90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9ba0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
9bb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
9bc0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
9bd0: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
9be0: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
9bf0: 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   *master = 0;.  
9c00: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
9c10: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
9c20: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
9c30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
9c40: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
9c50: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
9c60: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
9c70: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
9c80: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
9c90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9ca0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
9cb0: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
9cc0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
9cd0: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
9ce0: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
9cf0: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
9d00: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
9d10: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
9d20: 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e 52 65 61  lite3Os.xOpenRea
9d30: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
9d40: 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  master);.  if( r
9d50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9d60: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9d70: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
9d80: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
9d90: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d  ite3OsFileSize(m
9da0: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
9db0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
9dc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9dd0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9de0: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
9df0: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
9e00: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
9e10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
9e20: 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  terPtr = 0;..   
9e30: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
9e40: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
9e50: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
9e60: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
9e70: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
9e80: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
9e90: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
9ea0: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
9eb0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
9ec0: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
9ed0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
9ee0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9ef0: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
9f00: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
9f10: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
9f20: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9f30: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
9f40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9f50: 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a  OsRead(master, z
9f60: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
9f70: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9f80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9f90: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
9fa0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
9fb0: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
9fc0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
9fd0: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
9fe0: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
9ff0: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
a000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a010: 69 74 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73  ite3Os.xFileExis
a020: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
a030: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
a040: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
a050: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
a060: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a070: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
a080: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
a090: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
a0a0: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
a0b0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
a0c0: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
a0d0: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
a0e0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
a0f0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
a100: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
a110: 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d  sFile *journal =
a120: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
a130: 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
a140: 20 73 71 6c 69 74 65 33 4f 73 2e 78 4f 70 65 6e   sqlite3Os.xOpen
a150: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
a160: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
a170: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a180: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a190: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a1a0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a1b0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
a1c0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
a1d0: 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  al(journal, &zMa
a1e0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
a1f0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a200: 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (&journal);.    
a210: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a220: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a230: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a240: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
a250: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
a260: 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73  asterPtr!=0 && s
a270: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
a280: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
a290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
a2a0: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
a2b0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
a2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
a2d0: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
a2e0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
a2f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a300: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
a310: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a320: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
a340: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
a350: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
a360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73      }.  }.  .  s
a370: 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65 74 65  qlite3Os.xDelete
a380: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
a390: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
a3a0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
a3b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
a3c0: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
a3d0: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
a3e0: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
a3f0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a400: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
a410: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a420: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
a430: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
a440: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
a450: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
a460: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
a470: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
a480: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
a490: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
a4a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a4b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a4c0: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
a4d0: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
a4e0: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
a4f0: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
a500: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
a510: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
a520: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
a530: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
a540: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
a550: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
a560: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
a570: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
a580: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
a590: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
a5a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a5b0: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
a5c0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a5d0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
a5e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a5f0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
a600: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
a610: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
a620: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
a630: 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  [SQLITE_MAX_PAGE
a640: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
a650: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
a660: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a670: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
a680: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
a690: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
a6a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
a6b0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
a6c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
a6d0: 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
a6e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
a6f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a700: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a710: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
a720: 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
a730: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a740: 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
a750: 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20 70  E3("REFETCH %d p
a760: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
a770: 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
a780: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
a790: 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
a7a0: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
a7b0: 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e  , zBuf, pPg->pgn
a7c0: 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  o, 2);.    }else
a7d0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a  {.      memset(z
a7e0: 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Buf, 0, pPager->
a7f0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a800: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
a810: 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ef==0 || memcmp(
a820: 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44  zBuf, PGHDR_TO_D
a830: 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
a840: 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
a850: 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
a860: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
a870: 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
a880: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
a890: 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
a8a0: 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
a8b0: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
a8c0: 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
a8d0: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
a8e0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
a8f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
a900: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
a910: 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
a920: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
a930: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
a940: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65    }.    pPg->nee
a950: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
a960: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  Pg->dirty = 0;.#
a970: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
a980: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
a990: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
a9a0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
a9b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
a9c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a9d0: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
a9e0: 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65  main file of the
a9f0: 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20   given pager to 
aa00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
aa10: 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64  ges.** indicated
aa20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aa30: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
aa40: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
aa50: 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  t nPage){.  asse
aa60: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
aa70: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
aa80: 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  VE );.  return s
aa90: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
aaa0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
aab0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
aac0: 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  64)nPage);.}../*
aad0: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
aae0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
aaf0: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
ab00: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
ab10: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
ab20: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
ab30: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
ab40: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
ab50: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
ab60: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
ab70: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
ab80: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
ab90: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
aba0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
abb0: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
abc0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
abd0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
abe0: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
abf0: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
ac00: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
ac10: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
ac20: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
ac30: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
ac40: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
ac50: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
ac60: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
ac70: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
ac80: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
ac90: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
aca0: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
acb0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
acc0: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
acd0: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
ace0: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
acf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
ad00: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ad10: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
ad20: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
ad30: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
ad40: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
ad50: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
ad60: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
ad70: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
ad80: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ad90: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
ada0: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
adb0: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
adc0: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
add0: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
ade0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
adf0: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
ae00: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
ae10: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
ae20: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
ae30: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
ae40: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
ae50: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
ae60: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
ae70: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
ae80: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
ae90: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
aea0: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
aeb0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
aec0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
aed0: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
aee0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
aef0: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
af00: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
af10: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
af20: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
af30: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
af40: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
af50: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
af60: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
af70: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
af80: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
af90: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
afa0: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
afb0: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
afc0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
afd0: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
afe0: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
aff0: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
b000: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
b010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
b020: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
b030: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
b040: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
b050: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
b060: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
b070: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
b080: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
b090: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
b0a0: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
b0b0: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
b0c0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
b0d0: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
b0e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b0f0: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
b100: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
b110: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
b120: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
b130: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
b140: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
b150: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
b160: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
b170: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
b180: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
b190: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
b1a0: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
b1b0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
b1c0: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
b1d0: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
b1e0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
b1f0: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
b200: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
b210: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
b220: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
b230: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
b240: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
b250: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
b260: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
b270: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
b280: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
b290: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
b2a0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
b2b0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
b2c0: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
b2d0: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
b2e0: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
b2f0: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
b300: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
b310: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
b320: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
b330: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
b340: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
b350: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
b360: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
b370: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
b380: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
b390: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
b3a0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
b3b0: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
b3c0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
b3d0: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
b3e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
b3f0: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
b400: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
b410: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
b420: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
b430: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
b440: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
b450: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
b460: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
b470: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
b480: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
b490: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
b4a0: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
b4b0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
b4c0: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
b4d0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
b4e0: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
b4f0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
b500: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
b510: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
b520: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
b530: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
b540: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
b550: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
b560: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b570: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
b580: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
b590: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
b5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b5b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b5c0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
b5d0: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b5f0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
b600: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b610: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b630: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b640: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
b650: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
b660: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
b670: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
b680: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
b6b0: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
b6c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
b6d0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
b6e0: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
b6f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
b700: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
b710: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
b720: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
b730: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
b740: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
b750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
b760: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
b770: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
b780: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
b790: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
b7a0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
b7b0: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
b7c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b7d0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
b7e0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
b7f0: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
b800: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
b810: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
b820: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
b830: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
b840: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b850: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
b860: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
b870: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
b880: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
b890: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
b8a0: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
b8b0: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
b8c0: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
b8d0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
b8e0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
b8f0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  l(pPager->jfd, &
b900: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
b910: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
b920: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
b930: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
b940: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
b950: 65 33 4f 73 2e 78 46 69 6c 65 45 78 69 73 74 73  e3Os.xFileExists
b960: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
b970: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
b980: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
b990: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
b9a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
b9b0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
b9c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
b9d0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
b9e0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
b9f0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
ba00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ba10: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
ba20: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
ba30: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
ba40: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
ba50: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
ba60: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
ba70: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
ba80: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
ba90: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
baa0: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
bab0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
bac0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
bad0: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
bae0: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
baf0: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
bb00: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
bb10: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
bb20: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
bb30: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
bb40: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
bb50: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
bb60: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
bb70: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
bb80: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
bb90: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
bba0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
bbb0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
bbc0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
bbd0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
bbe0: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
bbf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bc00: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
bc10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
bc20: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
bc30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bc40: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
bc50: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bc60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
bc70: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
bc80: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
bc90: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
bca0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
bcb0: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
bcc0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
bcd0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
bce0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
bcf0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
bd00: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
bd10: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
bd20: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
bd30: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
bd40: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
bd50: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
bd60: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
bd70: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
bd80: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
bd90: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
bda0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
bdb0: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
bdc0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
bdd0: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
bde0: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
bdf0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
be00: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
be10: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
be20: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
be30: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
be40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
be50: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
be60: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
be70: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
be80: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
be90: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
bea0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
beb0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
bec0: 45 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  E && .        pP
bed0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bee0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
bef0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
bf00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bf10: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
bf20: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
bf30: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
bf40: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
bf50: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
bf60: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
bf70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bf80: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bf90: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bfa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
bfb0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
bfc0: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
bfd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
bfe0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
bff0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c000: 70 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20  pPager)); */.   
c010: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c020: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  OK ) goto end_pl
c030: 61 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f  ayback;.  .    /
c040: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
c050: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
c060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
c070: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
c080: 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
c090: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c0a0: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
c0b0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
c0c0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
c0d0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
c0e0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
c0f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c100: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
c110: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
c120: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
c130: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c140: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
c150: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
c160: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c170: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c180: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
c190: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c1b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
c1c0: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
c1d0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
c1e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
c1f0: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
c200: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
c210: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
c220: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
c230: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
c240: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
c250: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
c260: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
c270: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
c280: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
c290: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
c2a0: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
c2b0: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
c2c0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
c2d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c2e0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
c2f0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
c300: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
c310: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
c320: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
c330: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
c340: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
c350: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
c360: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
c370: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
c380: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
c390: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
c3a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
c3b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c3c0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
c3d0: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
c3e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c3f0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
c400: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
c410: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
c420: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
c430: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
c440: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
c450: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
c460: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
c470: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
c480: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
c490: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
c4a0: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
c4b0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
c4c0: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
c4d0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
c4e0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
c4f0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c500: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
c510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
c520: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
c530: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c540: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
c550: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
c560: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c570: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
c580: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
c590: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
c5a0: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
c5b0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
c5c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
c5d0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
c5e0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
c5f0: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
c600: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
c610: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
c620: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
c630: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
c640: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
c650: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
c660: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c670: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c680: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
c690: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
c6a0: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
c6b0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c6c0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
c6d0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
c6e0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
c6f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c700: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
c710: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
c720: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
c750: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
c760: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
c770: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
c780: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c790: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
c7a0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c7c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
c7d0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
c7e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c7f0: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
c800: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
c810: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
c820: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c830: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
c840: 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69   &os_szJ);.    i
c850: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c860: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c870: 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f    assert( szJ==o
c880: 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e  s_szJ );.  }.#en
c890: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64  dif..  /* Set hd
c8a0: 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f  rOff to be the o
c8b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  ffset to the fir
c8c0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
c8d0: 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  r written.  ** t
c8e0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
c8f0: 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68  ansaction, or th
c900: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
c910: 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
c920: 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
c930: 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
c940: 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
c950: 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
c960: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
c970: 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
c980: 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
c990: 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
c9a0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
c9b0: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
c9c0: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
c9d0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
c9e0: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  size..  */.  if(
c9f0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ca00: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
ca10: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
ca20: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
ca30: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
ca40: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
ca50: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
ca60: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
ca70: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
ca80: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
ca90: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
caa0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
cab0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
cac0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
cad0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
cae0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
caf0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
cb00: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
cb10: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
cb20: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
cb30: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
cb40: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
cb50: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
cb60: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
cb70: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
cb80: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
cb90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
cba0: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
cbb0: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
cbc0: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
cbd0: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
cbe0: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
cbf0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
cc00: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
cc10: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
cc20: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
cc30: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
cc40: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
cc50: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
cc60: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
cc70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
cc80: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cc90: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
cca0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
ccb0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
ccc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
ccd0: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
cce0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
ccf0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
cd00: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
cd10: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
cd20: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
cd30: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
cd40: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
cd50: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
cd60: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
cd70: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
cd80: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
cd90: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
cda0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
cdb0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
cdc0: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
cdd0: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
cde0: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
cdf0: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
ce00: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
ce10: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
ce20: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
ce30: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
ce40: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
ce50: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
ce60: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
ce70: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
ce80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
ce90: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
cea0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ceb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
cec0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
ced0: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
cee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
cef0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
cf00: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
cf10: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
cf20: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65  tmtCksum;.  asse
cf30: 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  rt( JOURNAL_HDR_
cf40: 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67  SZ(pPager)<(pPag
cf50: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20  er->pageSize+8) 
cf60: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  );.  while( pPag
cf70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
cf80: 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65  = (hdrOff-(pPage
cf90: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20  r->pageSize+8)) 
cfa0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
cfb0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
cfc0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
cfd0: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
cfe0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
cff0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d000: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d010: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d020: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
d030: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
d040: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
d050: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52  zJ ){.    u32 nR
d060: 65 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d  ec;.    u32 dumm
d070: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
d080: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
d090: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
d0a0: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
d0b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d0c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d0d0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d0e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
d0f0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d100: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
d110: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
d120: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
d130: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
d140: 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
d150: 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
d160: 20 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b     for(i=nRec-1;
d170: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
d180: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d190: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
d1a0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
d1b0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
d1c0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
d1d0: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
d1e0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
d1f0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
d200: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d210: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
d220: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
d230: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
d240: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
d250: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
d260: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
d270: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d280: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
d290: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
d2a0: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
d2b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
d2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
d2d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d2e0: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
d2f0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
d300: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
d310: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d320: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
d330: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
d340: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
d350: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
d360: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
d370: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61  ite3pager_set_ca
d380: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
d390: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
d3a0: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
d3b0: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
d3c0: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
d3d0: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
d3e0: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
d3f0: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
d400: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
d410: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
d420: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
d430: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
d440: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
d450: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
d460: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
d470: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
d480: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
d490: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d4a0: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
d4b0: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
d4c0: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
d4d0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
d4e0: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
d4f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
d500: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
d510: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
d520: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
d530: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
d540: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
d550: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d560: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
d570: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
d580: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d590: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d5a0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
d5b0: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
d5c0: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
d5d0: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
d5e0: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
d5f0: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
d600: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
d610: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
d620: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
d630: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
d640: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
d650: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
d660: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
d670: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
d680: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
d690: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
d6a0: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
d6b0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
d6c0: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
d6d0: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
d6e0: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
d6f0: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
d700: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
d710: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d720: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
d730: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
d740: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
d750: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
d760: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
d770: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
d780: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
d790: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
d7b0: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
d7c0: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
d7d0: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
d7e0: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
d7f0: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
d800: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
d810: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
d820: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
d830: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
d840: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
d850: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
d860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d870: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
d880: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
d890: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
d8a0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
d8b0: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
d8c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d8d0: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
d8e0: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
d8f0: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
d900: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
d910: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
d920: 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
d930: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
d940: 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a  ty_level(Pager *
d950: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
d960: 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  l){.  pPager->no
d970: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
d980: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
d990: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
d9a0: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
d9b0: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
d9c0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
d9d0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d9e0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d9f0: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
da00: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
da10: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
da20: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
da30: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
da40: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
da50: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
da60: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
da70: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
da80: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
da90: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
daa0: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
dab0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
dac0: 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
dad0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
dae0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57  mporary file.  W
daf0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
db00: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a   the file into z
db10: 46 69 6c 65 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d  File.** (zFile m
db20: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
db30: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
db40: 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e  SIZE bytes long.
db50: 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  )  Write.** the 
db60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
db70: 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
db80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
db90: 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
dba0: 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
dbb0: 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a  de if we fail..*
dbc0: 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c  *.** The OS will
dbd0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
dbe0: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
dbf0: 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
dc00: 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a   is.** closed..*
dc10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
dc20: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
dc30: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
dc40: 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20  OsFile **pFd){. 
dc50: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
dc60: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
dc70: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
dc80: 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
dc90: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
dca0: 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20  lysis only */.  
dcb0: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
dcc0: 20 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 54 65     sqlite3Os.xTe
dcd0: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65  mpFileName(zFile
dce0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
dcf0: 74 65 33 4f 73 2e 78 4f 70 65 6e 45 78 63 6c 75  te3Os.xOpenExclu
dd00: 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c  sive(zFile, pFd,
dd10: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
dd20: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
dd30: 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
dd40: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
dd50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
dd60: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
dd70: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
dd80: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
dd90: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
dda0: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
ddb0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
ddc0: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
ddd0: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
dde0: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
ddf0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
de00: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70  call to sqlite3p
de10: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
de20: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
de30: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
de40: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
de50: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
de60: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
de70: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
de80: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
de90: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
dea0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
deb0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
dec0: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
ded0: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
dee0: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
def0: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
df00: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
df10: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
df20: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
df30: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
df40: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
df50: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
df60: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
df70: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
df80: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
df90: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
dfa0: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
dfb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
dfc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
dfd0: 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65  ger_open(.  Page
dfe0: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
dff0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
e000: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e010: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
e020: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e030: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
e040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e050: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
e060: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
e070: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
e080: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
e090: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
e0a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
e0b0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
e0c0: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
e0d0: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
e0e0: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
e0f0: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
e100: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
e110: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
e120: 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65  ameLen;.  OsFile
e130: 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *fd;.  int rc =
e140: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
e150: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
e160: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
e170: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
e180: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
e190: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
e1a0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
e1b0: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
e1c0: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
e1d0: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
e1e0: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
e1f0: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
e200: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
e210: 45 5f 53 49 5a 45 5d 3b 0a 20 20 53 71 6c 69 74  E_SIZE];.  Sqlit
e220: 65 54 73 64 20 2a 70 54 73 64 20 3d 20 73 71 6c  eTsd *pTsd = sql
e230: 69 74 65 33 54 73 64 28 29 3b 0a 0a 20 20 2f 2a  ite3Tsd();..  /*
e240: 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73   If malloc() has
e250: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20   already failed 
e260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e270: 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e  MEM. Before even
e280: 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f  .  ** testing fo
e290: 72 20 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50  r this, set *ppP
e2a0: 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20  ager to NULL so 
e2b0: 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73  the caller knows
e2c0: 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
e2d0: 73 74 72 75 63 74 75 72 65 20 77 61 73 20 6e 65  structure was ne
e2e0: 76 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a  ver allocated. .
e2f0: 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20    */.  *ppPager 
e300: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
e310: 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46  e3Tsd()->mallocF
e320: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
e330: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e340: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
e350: 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64  fd, 0, sizeof(fd
e360: 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  ));..  /* Open t
e370: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e  he pager file an
e380: 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e  d set zFullPathn
e390: 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ame to point at 
e3a0: 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a  malloc()ed .  **
e3b0: 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69   memory containi
e3c0: 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ng the complete 
e3d0: 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69  filename (i.e. i
e3e0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72  ncluding the dir
e3f0: 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20  ectory)..  */.  
e400: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
e410: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
e420: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e430: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
e440: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
e450: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
e460: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
e470: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
e480: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e490: 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29  sqliteStrDup("")
e4a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
e4b0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
e4c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e4d0: 71 6c 69 74 65 33 4f 73 2e 78 46 75 6c 6c 50 61  qlite3Os.xFullPa
e4e0: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
e4f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  );.      if( zFu
e500: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
e510: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e520: 65 33 4f 73 2e 78 4f 70 65 6e 52 65 61 64 57 72  e3Os.xOpenReadWr
e530: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
e540: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
e550: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
e560: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
e570: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
e580: 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
e590: 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65   &fd);.    zFile
e5a0: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
e5b0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
e5c0: 3d 20 73 71 6c 69 74 65 33 4f 73 2e 78 46 75 6c  = sqlite3Os.xFul
e5d0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
e5e0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
e5f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e600: 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
e610: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
e620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
e630: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
e640: 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   As part of the 
e650: 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  same allocation,
e660: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   allocate.  ** s
e670: 70 61 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c  pace for the ful
e680: 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65 20 66  l paths of the f
e690: 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61  ile, directory a
e6a0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  nd journal .  **
e6b0: 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d   (Pager.zFilenam
e6c0: 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  e, Pager.zDirect
e6d0: 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ory and Pager.zJ
e6e0: 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20  ournal)..  */.  
e6f0: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
e700: 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e  e ){.    nameLen
e710: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
e720: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50  athname);.    pP
e730: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
e740: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
e750: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33  ger) + nameLen*3
e760: 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a 0a 20 20   + 30 );.  }..  
e770: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
e780: 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
e790: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
e7a0: 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d  bove, free the m
e7b0: 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e  emory .  ** poin
e7c0: 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50  ted to by zFullP
e7d0: 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68  athname, free th
e7e0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
e7f0: 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
e800: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63  .  ** file. Sinc
e810: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
e820: 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
e830: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
e840: 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
e850: 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
e860: 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
e870: 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a  f( !pPager || !z
e880: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20  FullPathname || 
e890: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
e8b0: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71  ose(&fd);.    sq
e8c0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
e8d0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  thname);.    sql
e8e0: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
e8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
e900: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
e910: 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
e920: 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22 4f 50   }..  TRACE3("OP
e930: 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
e940: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a  EHANDLEID(fd), z
e950: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e960: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
e970: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
e980: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
e990: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
e9a0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
e9b0: 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  e[nameLen+1];.  
e9c0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e9d0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
e9e0: 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31  ectory[nameLen+1
e9f0: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  ];.  strcpy(pPag
ea00: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
ea10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ea20: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
ea30: 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c  zDirectory, zFul
ea40: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66  lPathname);..  f
ea50: 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e  or(i=nameLen; i>
ea60: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
ea70: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
ea80: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
ea90: 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
eaa0: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
eab0: 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  0;.  strcpy(pPag
eac0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46  er->zJournal, zF
ead0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
eae0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
eaf0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
eb00: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
eb10: 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20  urnal[nameLen], 
eb20: 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70  "-journal");.  p
eb30: 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  Pager->fd = fd;.
eb40: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
eb50: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  lOpen = 0;.  pPa
eb60: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
eb70: 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
eb80: 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
eb90: 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e  ->noReadlock = n
eba0: 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
ebb0: 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d  dOnly;.  pPager-
ebc0: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
ebd0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
ebe0: 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  se = 0;.  pPager
ebf0: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50  ->nRef = 0;.  pP
ec00: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
ec10: 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
ec20: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
ec30: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
ec40: 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d  _SIZE;.  pPager-
ec50: 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20  >stmtSize = 0;. 
ec60: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
ec70: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
ec80: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
ec90: 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
eca0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  = 0;.  pPager->m
ecb0: 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
ecc0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
ecd0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70  AGER_UNLOCK;.  p
ece0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
ecf0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   0;.  pPager->te
ed00: 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
ed10: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
ed20: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
ed30: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
ed40: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61   readOnly;.  pPa
ed50: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
ed60: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  0;.  pPager->noS
ed70: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
ed80: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
ed90: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
eda0: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
edb0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
edc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
edd0: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
ede0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
edf0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
ee00: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
ee10: 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  r->nExtra = FORC
ee20: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
ee30: 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ra);.  pPager->s
ee40: 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45  ectorSize = PAGE
ee50: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  R_SECTOR_SIZE;. 
ee60: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
ee70: 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d  ndler = 0;.  mem
ee80: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
ee90: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
eea0: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
eeb0: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
eec0: 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  r;.  pPager->pNe
eed0: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
eee0: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
eef0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
ef00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ef10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
ef20: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
ef30: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
ef40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
ef50: 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  _busyhandler(Pag
ef60: 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
ef70: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
ef80: 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
ef90: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
efa0: 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
efb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
efc0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
efd0: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
efe0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
eff0: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
f000: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
f010: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
f020: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
f030: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
f040: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
f050: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
f060: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
f070: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
f080: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
f090: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
f0a0: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
f0b0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
f0c0: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
f0d0: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  e3pager_close().
f0e0: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
f0f0: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
f100: 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65  d by sqlite3page
f110: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  r_unref()..*/.vo
f120: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
f130: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
f140: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
f150: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
f160: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
f170: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
f180: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
f190: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
f1a0: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
f1b0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
f1c0: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
f1d0: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
f1e0: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
f1f0: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
f200: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
f210: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
f220: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
f230: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
f240: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
f250: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
f260: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
f270: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
f280: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
f290: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
f2a0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
f2b0: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
f2c0: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
f2d0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72  lite3pager_set_r
f2e0: 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
f2f0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
f300: 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74  einit)(void*,int
f310: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
f320: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
f330: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
f340: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
f350: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
f360: 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
f370: 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
f380: 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
f390: 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
f3a0: 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
f3b0: 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
f3c0: 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
f3d0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
f3e0: 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73  3pager_set_pages
f3f0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
f400: 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  r, int pageSize)
f410: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  {.  assert( page
f420: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
f430: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
f440: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
f450: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
f460: 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
f470: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
f480: 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65  geSize;.  }.  re
f490: 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67  turn pPager->pag
f4a0: 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
f4b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
f4c0: 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
f4d0: 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
f4e0: 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
f4f0: 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
f500: 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
f510: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
f520: 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
f530: 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
f540: 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
f550: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
f560: 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
f570: 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
f580: 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
f590: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
f5a0: 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
f5b0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
f5c0: 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
f5d0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
f5e0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
f5f0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f600: 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
f610: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
f620: 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
f630: 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63  aved_cnt;.void c
f640: 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69  lear_simulated_i
f650: 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c  o_error(){.  sql
f660: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
f670: 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69  t = 0;.}.void di
f680: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
f690: 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
f6a0: 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
f6b0: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f6c0: 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
f6d0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
f6e0: 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
f6f0: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
f700: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
f710: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
f720: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
f730: 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
f740: 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61  se.# define clea
f750: 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  r_simulated_io_e
f760: 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20  rror().# define 
f770: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
f780: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
f790: 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
f7a0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f7b0: 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
f7c0: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
f7d0: 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
f7e0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
f7f0: 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
f800: 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
f810: 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
f820: 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
f830: 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
f840: 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
f850: 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
f860: 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
f870: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
f880: 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
f890: 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
f8a0: 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
f8b0: 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
f8c0: 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
f8d0: 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
f8e0: 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
f8f0: 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
f900: 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
f910: 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
f920: 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
f930: 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
f940: 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
f950: 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
f960: 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
f970: 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
f980: 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
f990: 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  his)..*/.void sq
f9a0: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f  lite3pager_read_
f9b0: 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  fileheader(Pager
f9c0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
f9d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f9e0: 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74  pDest){.  memset
f9f0: 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
fa00: 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b   if( MEMDB==0 ){
fa10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
fa20: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ek(pPager->fd, 0
fa30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
fa40: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
fa50: 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20   pDest, N);.    
fa60: 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
fa70: 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a  io_error();.  }.
fa80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
fa90: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
faa0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
fab0: 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
fac0: 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
fad0: 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ager. .**.** If 
fae0: 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  the PENDING_BYTE
faf0: 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
fb00: 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72  e directly after
fb10: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
fb20: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f  ** file, then co
fb30: 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65  nsider this page
fb40: 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
fb50: 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70  e too. For examp
fb60: 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e  le, if.** PENDIN
fb70: 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34  G_BYTE is byte 4
fb80: 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62  096 (the first b
fb90: 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61  yte of page 5) a
fba0: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
fbb0: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30  he.** file is 40
fbc0: 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72  96 bytes, 5 is r
fbd0: 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20  eturned instead 
fbe0: 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 4..*/.int sql
fbf0: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
fc00: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
fc10: 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61  r){.  i64 n;.  a
fc20: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
fc30: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
fc40: 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
fc50: 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
fc60: 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
fc70: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
fc80: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
fc90: 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c  er->fd, &n)!=SQL
fca0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fcb0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
fcc0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  |= PAGER_ERR_DIS
fcd0: 4b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  K;.      return 
fce0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
fcf0: 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
fd00: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
fd10: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
fd20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
fd30: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fd40: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
fd50: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
fd60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
fd70: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
fd80: 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
fd90: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
fda0: 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
fdb0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
fdc0: 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72      n++;.  }.  r
fdd0: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
fde0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
fdf0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
fe00: 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
fe10: 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  Pager*);.../*.**
fe20: 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
fe30: 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
fe40: 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
fe50: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
fe60: 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
fe70: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
fe80: 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
fe90: 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
fea0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
feb0: 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
fec0: 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67  te3pager_movepag
fed0: 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  e() routine can 
fee0: 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20  leave a page in 
fef0: 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65  the .** pNextFre
ff00: 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74  e/pPrevFree list
ff10: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
ff20: 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d  art of any hash-
ff30: 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
ff40: 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68   void unlinkHash
ff50: 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Chain(Pager *pPa
ff60: 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
ff70: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  {.  if( pPg->pgn
ff80: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  o==0 ){.    /* I
ff90: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
ffa0: 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  r is zero, then 
ffb0: 74 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f 74  this page is not
ffc0: 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63 68 61   in any hash cha
ffd0: 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  in. */.    retur
ffe0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  n;.  }.  if( pPg
fff0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
10000 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
10010 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
10020 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
10030 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
10040 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61  revHash ){.    a
10050 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
10060 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
10070 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50 67  pPg->pgno)]!=pPg
10080 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
10090 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
100a0 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
100b0 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sh;.  }else{.   
100c0 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72 5f 68   int h = pager_h
100d0 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ash(pPg->pgno);.
100e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
100f0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70 50  er->aHash[h]==pP
10100 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
10110 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d  >aHash[h] = pPg-
10120 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
10130 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30  .  pPg->pgno = 0
10140 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ;.  pPg->pNextHa
10150 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
10160 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ash = 0;.}../*.*
10170 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20  * Unlink a page 
10180 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
10190 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20  st (the list of 
101a0 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20  all pages where 
101b0 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20  nRef==0).** and 
101c0 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f  from its hash co
101d0 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a  llision chain..*
101e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
101f0 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a  linkPage(PgHdr *
10200 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
10210 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
10220 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  ger;..  /* Keep 
10230 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64  the pFirstSynced
10240 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
10250 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73  g at the first s
10260 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65  ynchronized page
10270 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70   */.  if( pPg==p
10280 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10290 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72  ced ){.    PgHdr
102a0 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
102b0 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  Free;.    while(
102c0 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
102d0 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
102e0 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61  tFree; }.    pPa
102f0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10300 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = p;.  }..  /*
10310 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
10320 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69   freelist */.  i
10330 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
10340 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50  e ){.    pPg->pP
10350 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
10360 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  ee = pPg->pNextF
10370 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
10380 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10390 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b  ->pFirst==pPg );
103a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
103b0 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
103c0 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Free;.  }.  if( 
103d0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
103e0 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
103f0 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
10400 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
10410 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
10420 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
10430 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Last==pPg );.   
10440 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
10450 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
10460 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
10470 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  tFree = pPg->pPr
10480 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f  evFree = 0;..  /
10490 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
104a0 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
104b0 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  e */.  unlinkHas
104c0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
104d0 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Pg);.}..#ifndef 
104e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
104f0 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RYDB./*.** This 
10500 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
10510 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69  to truncate an i
10520 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
10530 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c  e.  Delete.** al
10540 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  l pages whose pg
10550 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  no is larger tha
10560 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
10570 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65   and is unrefere
10580 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e  nced..** Referen
10590 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
105a0 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
105b0 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
105c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
105d0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50  memoryTruncate(P
105e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
105f0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
10600 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
10610 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
10620 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
10630 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
10640 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
10650 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
10660 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
10670 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
10680 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
10690 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
106a0 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
106b0 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
106c0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
106d0 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
106e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
106f0 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
10700 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
10710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
10720 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
10730 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  All;.      unlin
10740 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
10750 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
10760 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
10770 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
10780 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
10790 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  ine memoryTrunca
107a0 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  te(p).#endif../*
107b0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
107c0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
107d0 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
107e0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
107f0 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
10800 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
10810 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
10820 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
10830 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
10840 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
10850 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
10860 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
10870 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10880 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
10890 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
108a0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
108b0 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
108c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
108d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
108e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
108f0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
10900 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  rc;.  assert( PA
10910 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
10920 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
10930 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
10940 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
10950 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
10960 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
10970 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
10980 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10990 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
109a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
109b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
109c0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
109d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
109e0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
109f0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
10a00 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
10a10 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
10a20 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
10a30 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
10a40 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
10a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10a60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10a70 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
10a80 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pe;.    }.  }.  
10a90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10aa0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
10ab0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
10ac0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
10ad0 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
10ae0 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
10af0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
10b00 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
10b10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
10b20 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
10b30 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
10b40 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
10b50 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
10b60 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
10b70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
10b80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
10b90 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
10ba0 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
10bb0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10bd0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
10be0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10bf0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
10c00 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
10c10 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
10c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10c30 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
10c40 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
10c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10c70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
10c80 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10c90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
10ca0 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
10cb0 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
10cc0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
10cd0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
10ce0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
10cf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10d00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10d10 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
10d20 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
10d30 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66  er, nPage);.  if
10d40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10d50 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
10d60 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
10d70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10d80 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
10d90 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
10da0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
10db0 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
10dc0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
10dd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
10de0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
10df0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10e00 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
10e10 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
10e20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
10e30 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
10e40 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
10e50 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
10e60 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
10e70 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
10e80 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
10e90 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
10ea0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
10eb0 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
10ec0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
10ed0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
10ee0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
10ef0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
10f00 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
10f10 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
10f20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
10f30 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
10f40 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
10f50 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
10f60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
10f70 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
10f80 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
10f90 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
10fa0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
10fb0 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
10fc0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
10fd0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
10fe0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10ff0 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
11000 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11010 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23 69 66  pPg, *pNext;.#if
11020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11030 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
11040 4e 54 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a  NT.  SqliteTsd *
11050 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73  pTsd = sqlite3Ts
11060 64 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  d();.#endif..  s
11070 77 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73  witch( pPager->s
11080 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65  tate ){.    case
11090 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a   PAGER_RESERVED:
110a0 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
110b0 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73  SYNCED: .    cas
110c0 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
110d0 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  E: {.      /* We
110e0 20 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65   ignore any IO e
110f0 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72  rrors that occur
11100 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
11110 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70  back.      ** op
11120 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61  eration. So disa
11130 62 6c 65 20 49 4f 20 65 72 72 6f 72 20 73 69 6d  ble IO error sim
11140 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  ulation so that 
11150 74 65 73 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  testing.      **
11160 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73 69   works more easi
11170 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
11180 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
11190 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
111a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70  ;.      sqlite3p
111b0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
111c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 65 6e 61  ager);.      ena
111d0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
111e0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20  _errors();.     
111f0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
11200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11210 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
11220 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
11230 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
11240 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  t( pPager->errMa
11250 73 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  sk || pPager->jo
11260 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
11270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11280 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45   }.    case PAGE
11290 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20  R_SHARED: {.    
112a0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
112b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
112c0 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
112d0 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
112e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
112f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
11300 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
11310 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
11320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11330 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d  }.  }.  for(pPg=
11340 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
11350 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23  g; pPg=pNext){.#
11360 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
11370 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
11380 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
11390 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
113a0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
113b0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
113c0 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
113d0 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
113e0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
113f0 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
11400 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
11410 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
11420 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d  ndif.    pNext =
11430 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
11440 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
11450 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  Pg);.  }.  TRACE
11460 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  2("CLOSE %d\n", 
11470 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
11480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11490 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 28  er->errMask || (
114a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
114b0 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pen==0 && pPager
114c0 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29  ->stmtOpen==0) )
114d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
114e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
114f0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11500 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
11510 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
11520 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
11530 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61  rnal);.  if( pPa
11540 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
11550 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
11560 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ose(&pPager->stf
11570 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11580 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
11590 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
115a0 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
115b0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
115c0 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
115d0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
115e0 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
115f0 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65 74 65  qlite3Os.xDelete
11600 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
11610 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
11620 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11630 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  _OMIT_MEMORY_MAN
11640 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
11650 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
11660 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
11670 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
11680 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 53  rting at .  ** S
11690 71 6c 69 74 65 54 73 64 2e 70 50 61 67 65 72 2e  qliteTsd.pPager.
116a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
116b0 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72  er==pTsd->pPager
116c0 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50   ){.    pTsd->pP
116d0 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ager = pPager->p
116e0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
116f0 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a     Pager *pTmp;.
11700 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70      for(pTmp = p
11710 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d  Tsd->pPager; pTm
11720 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72  p->pNext!=pPager
11730 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
11740 78 74 29 3b 0a 20 20 20 20 70 54 6d 70 2d 3e 70  xt);.    pTmp->p
11750 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Next = pPager->p
11760 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Next;.  }.#endif
11770 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ..  sqliteFree(p
11780 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
11790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
117a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
117b0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
117c0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
117d0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
117e0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
117f0 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  mber(void *pData
11800 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
11810 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
11820 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
11830 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
11840 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
11850 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
11860 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
11870 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
11880 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
11890 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
118a0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
118b0 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
118c0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
118d0 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
118e0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
118f0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
11900 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
11910 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
11920 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
11930 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
11940 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
11950 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
11960 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
11970 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
11980 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
11990 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
119a0 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
119b0 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
119c0 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
119d0 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
119e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
119f0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
11a00 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
11a10 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
11a20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
11a30 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
11a40 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
11a50 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
11a60 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
11a70 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
11a80 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
11a90 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
11aa0 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
11ab0 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
11ac0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
11ad0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
11ae0 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
11af0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
11b00 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
11b10 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
11b20 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
11b30 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
11b40 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
11b50 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
11b60 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11b70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
11b80 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
11b90 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
11ba0 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
11bb0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11bd0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
11be0 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
11bf0 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
11c00 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
11c10 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
11c20 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
11c30 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
11c40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11c50 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11c60 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
11c70 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
11c80 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
11c90 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
11ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11cb0 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
11cc0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
11cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
11ce0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
11cf0 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
11d00 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
11d10 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
11d20 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
11d30 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
11d40 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
11d50 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
11d60 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
11d70 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
11d80 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
11d90 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
11da0 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f  ite3pager_ref(vo
11db0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
11dc0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
11dd0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
11de0 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
11df0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11e00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
11e10 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
11e20 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
11e30 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
11e40 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
11e50 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
11e60 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
11e70 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
11e80 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
11e90 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
11ea0 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
11eb0 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
11ec0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
11ed0 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
11ee0 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
11ef0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
11f00 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
11f10 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
11f20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
11f30 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
11f40 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
11f50 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
11f60 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
11f70 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
11f80 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
11f90 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
11fa0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
11fb0 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
11fc0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11fd0 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
11fe0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
11ff0 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
12000 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12010 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
12020 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
12030 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
12040 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
12050 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
12060 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
12070 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
12080 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
12090 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
120a0 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
120b0 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
120c0 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
120d0 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
120e0 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
120f0 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
12100 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
12110 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
12120 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
12130 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
12140 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
12150 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
12160 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
12170 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
12180 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
12190 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  so sync occurs..
121a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
121b0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
121c0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
121d0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
121e0 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
121f0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
12200 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
12210 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12220 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
12230 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12240 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
12250 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
12260 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
12270 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
12280 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
12290 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
122a0 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
122b0 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
122c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
122d0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
122e0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
122f0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
12300 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
12310 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
12320 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70     /* assert( !p
12330 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
12340 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74   // noSync might
12350 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68   be set if synch
12360 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  ronous.      ** 
12370 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61  was turned off a
12380 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
12390 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
123a0 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a  .  Ticket #615 *
123b0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
123c0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
123d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
123e0 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63  e pPager->nRec c
123f0 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65  ounter we are ke
12400 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20  eping agrees.   
12410 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
12420 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
12430 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
12440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12450 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
12460 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20       i64 jSz;.  
12470 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12480 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12490 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
124a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
124b0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
124c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
124d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
124e0 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
124f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
12500 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
12510 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
12520 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
12530 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
12540 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
12550 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
12560 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
12570 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
12580 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
12590 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
125a0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
125b0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
125c0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
125d0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
125e0 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
125f0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
12600 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
12610 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
12620 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
12630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
12640 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
12650 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
12660 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
12670 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
12680 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
12690 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
126a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
126b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
126c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
126d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
126e0 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  ek(pPager->jfd,.
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12700 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
12710 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
12720 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
12730 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
12740 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12750 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
12760 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
12770 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
12780 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20  ->nRec);.       
12790 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
127a0 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63   rc;..        rc
127b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
127c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
127d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
127e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
127f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
12800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
12810 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
12820 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
12830 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
12840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12850 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
12860 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
12870 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  Sync);.      if(
12880 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
12890 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
128a0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
128b0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
128c0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
128d0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
128e0 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
128f0 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
12900 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
12910 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
12920 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
12930 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
12940 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
12950 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
12960 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
12970 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
12980 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  r->pFirst;.  }..
12990 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
129a0 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
129b0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
129c0 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
129d0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
129e0 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
129f0 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
12a00 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
12a10 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
12a20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
12a30 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
12a40 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
12a50 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
12a60 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
12a70 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
12a80 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
12a90 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
12aa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12ab0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
12ac0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
12ad0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12ae0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12af0 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
12b00 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
12b10 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
12b20 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
12b30 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
12b40 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
12b50 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
12b60 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
12b70 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
12b80 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
12b90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12ba0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
12bb0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
12bc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
12bd0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12be0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
12bf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
12c00 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
12c10 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
12c20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
12c30 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
12c40 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
12c50 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
12c60 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
12c70 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
12c80 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
12c90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
12ca0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
12cb0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
12cc0 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
12cd0 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
12ce0 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
12cf0 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
12d00 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
12d10 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
12d20 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
12d30 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
12d40 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
12d50 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
12d60 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
12d70 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
12d80 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
12d90 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
12da0 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
12db0 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
12dc0 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
12dd0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
12de0 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
12df0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
12e00 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
12e10 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
12e20 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
12e30 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
12e40 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
12e50 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
12e60 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
12e70 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12e80 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
12e90 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
12ea0 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
12eb0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
12ec0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
12ed0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
12ee0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
12ef0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
12f00 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
12f10 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
12f20 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
12f30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
12f40 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
12f50 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
12f60 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
12f70 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
12f80 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
12f90 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
12fa0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
12fb0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
12fc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12fd0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
12fe0 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  rc;.  }..  while
12ff0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
13000 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
13010 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rty );.    rc = 
13020 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
13030 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74  ager->fd, (pList
13040 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
13050 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
13060 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
13070 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a  eturn rc;.    /*
13080 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
13090 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
130a0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
130b0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
130c0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
130d0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
130e0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
130f0 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
13100 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
13110 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
13120 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
13130 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
13140 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
13150 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
13160 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
13170 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
13180 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13190 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
131a0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
131b0 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
131c0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
131d0 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
131e0 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54  gno, 6);.      T
131f0 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20  RACE3("STORE %d 
13200 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
13210 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
13220 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  st->pgno);.     
13230 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
13240 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
13250 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
13260 4c 69 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20  List),.         
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13280 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
13290 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 43 4f 44  Size);.      COD
132a0 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  EC(pPager, PGHDR
132b0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
132c0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29   pList->pgno, 0)
132d0 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43  ;.      TEST_INC
132e0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
132f0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
13300 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
13310 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  {.      TRACE3("
13320 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
13330 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13340 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
13350 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gno);.    }.#end
13360 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  if.    if( rc ) 
13370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
13380 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b  List->dirty = 0;
13390 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
133a0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
133b0 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
133c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
133d0 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
133e0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
133f0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
13400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
13420 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
13430 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
13440 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
13450 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
13460 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
13470 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
13480 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
13490 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
134a0 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
134b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
134c0 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
134d0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
134e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
134f0 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74  PgHdr *p, *pList
13500 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ;.  pList = 0;. 
13510 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
13520 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
13530 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
13540 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
13550 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c    p->pDirty = pL
13560 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  ist;.      pList
13570 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = p;.    }.  }.
13580 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
13590 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
135a0 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73  TRUE if there is
135b0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
135c0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
135d0 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
135e0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
135f0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
13600 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
13610 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
13620 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
13630 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
13640 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
13650 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
13660 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
13670 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
13680 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
13690 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
136a0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
136b0 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
136c0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  he journal..*/.s
136d0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
136e0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
136f0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
13700 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
13710 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
13720 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 2e 78  if( !sqlite3Os.x
13730 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65  FileExists(pPage
13740 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72  r->zJournal) ) r
13750 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
13760 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
13770 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
13780 2d 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30  ->fd) ) return 0
13790 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 70  ;.  if( sqlite3p
137a0 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
137b0 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
137c0 20 73 71 6c 69 74 65 33 4f 73 2e 78 44 65 6c 65   sqlite3Os.xDele
137d0 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
137e0 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nal);.    return
137f0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
13800 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
13810 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66  ../*.** Try to f
13820 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
13830 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e  e cache that can
13840 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a   be recycled. .*
13850 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13860 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  e may return SQL
13870 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
13880 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45  E_FULL or SQLITE
13890 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73  _OK. It .** does
138a0 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61   not set the pPa
138b0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 76 61 72  ger->errMask var
138c0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
138d0 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63   int pager_recyc
138e0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
138f0 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67  , int syncOk, Pg
13900 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
13910 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
13920 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  Pg = 0;..  /* Fi
13930 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
13940 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
13950 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
13960 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72   does not.  ** r
13970 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20  equire us to do 
13980 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68  an fsync() on th
13990 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  e journal..  */.
139a0 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
139b0 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
139c0 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
139d0 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
139e0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
139f0 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29  quire an fsync()
13a00 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75  .  ** on the jou
13a10 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66  rnal file then f
13a20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
13a30 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
13a40 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77  a.  ** very slow
13a50 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77   operation, so w
13a60 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61  e work hard to a
13a70 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f  void it.  But so
13a80 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20  metimes.  ** it 
13a90 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
13aa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  .  */.  if( pPg=
13ab0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
13ac0 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26  irst && syncOk &
13ad0 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69  & !MEMDB){.    i
13ae0 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
13af0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
13b00 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
13b10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13b20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
13b30 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
13b40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
13b50 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
13b60 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
13b70 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
13b80 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
13b90 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
13ba0 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
13bb0 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
13bc0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
13bd0 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
13be0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
13bf0 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
13c00 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
13c10 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
13c20 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
13c30 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
13c40 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
13c50 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
13c60 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
13c70 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
13c80 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
13c90 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
13ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
13cb0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13cc0 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
13cd0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
13ce0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
13cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
13d00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
13d10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13d20 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
13d30 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
13d40 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
13d50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13d60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
13d70 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
13d80 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
13d90 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
13da0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13db0 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
13dc0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
13dd0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
13de0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
13df0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
13e00 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d  c==0 );.    pPg-
13e10 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
13e20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
13e30 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
13e40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13e70 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
13e80 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
13e90 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
13ea0 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
13eb0 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
13ec0 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
13ed0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20  , then.  ** set 
13ee0 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
13ef0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
13f00 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
13f10 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64  he.  ** sqlite_d
13f20 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f  ont_rollback() o
13f30 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
13f40 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
13f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
13f60 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
13f70 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
13f80 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
13f90 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
13fa0 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
13fb0 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
13fc0 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
13fd0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
13fe0 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
13ff0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
14000 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
14010 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
14020 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
14030 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
14040 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
14050 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
14060 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
14070 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
14080 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
14090 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
140a0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d  ollback = 1;.  }
140b0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
140c0 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
140d0 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
140e0 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
140f0 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61  .  */.  unlinkPa
14100 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54 5f  ge(pPg);.  TEST_
14110 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76  INCR(pPager->nOv
14120 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20  fl);..  *ppPg = 
14130 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
14140 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14150 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14160 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65  is called to fre
14170 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79  e superfluous dy
14180 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
14190 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65  ted memory.** he
141a0 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ld by the pager 
141b0 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69  system. Memory i
141c0 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c  n use by any SQL
141d0 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61  ite pager alloca
141e0 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75  ted.** by the cu
141f0 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79  rrent thread may
14200 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28 29   be sqliteFree()
14210 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
14220 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
14230 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
14240 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
14250 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
14260 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
14270 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
14280 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20  rns. A negative 
14290 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d  value for nReq m
142a0 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20  eans.** free as 
142b0 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
142c0 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74  ossible. The ret
142d0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
142e0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a   total number .*
142f0 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  * of bytes of me
14300 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  mory released..*
14310 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
14320 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  _OMIT_MEMORY_MAN
14330 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69  AGEMENT.int sqli
14340 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61 73 65  te3pager_release
14350 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  _memory(int nReq
14360 29 7b 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a  ){.  SqliteTsd *
14370 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73  pTsd = sqlite3Ts
14380 64 28 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b  d();.  Pager *p;
14390 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
143a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a   = 0;.  int i;..
143b0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 69 73 61    /* If the disa
143c0 62 6c 65 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79  bleReleaseMemory
143d0 20 6d 65 6d 6f 72 79 20 66 6c 61 67 20 69 73 20   memory flag is 
143e0 73 65 74 2c 20 74 68 69 73 20 6f 70 65 72 61 74  set, this operat
143f0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 61 20 6e 6f  ion is.  ** a no
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 54 68 65 20 66 6c 61 67 20 69 73  eed. The flag is
14430 20 73 65 74 20 62 65 66 6f 72 65 0a 20 20 2a 2a   set before.  **
14440 20 6d 61 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c   malloc() is cal
14450 6c 65 64 20 77 68 69 6c 65 20 74 68 65 20 67 6c  led while the gl
14460 6f 62 61 6c 20 6d 75 74 65 78 20 28 73 65 65 20  obal mutex (see 
14470 73 71 6c 69 74 65 33 4f 73 2e 78 45 6e 74 65 72  sqlite3Os.xEnter
14480 4d 75 74 65 78 29 20 0a 20 20 2a 2a 20 69 73 20  Mutex) .  ** is 
14490 68 65 6c 64 2e 20 42 65 63 61 75 73 65 20 73 6f  held. Because so
144a0 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69  me of the code i
144b0 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66  nvoked by this f
144c0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f  unction may also
144d0 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74  .  ** try to obt
144e0 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 70  ain the mutex, p
144f0 72 6f 63 65 64 69 6e 67 20 6d 61 79 20 63 61 75  roceding may cau
14500 73 65 20 61 20 64 65 61 64 6c 6f 63 6b 2e 20 0a  se a deadlock. .
14510 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 73 64 2d    */.  if( pTsd-
14520 3e 64 69 73 61 62 6c 65 52 65 6c 65 61 73 65 4d  >disableReleaseM
14530 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 72 65 74  emory ){.    ret
14540 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
14550 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20   Outermost loop 
14560 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74  runs for at most
14570 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e   two iterations.
14580 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   First iteration
14590 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20   we.  ** try to 
145a0 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74  find memory that
145b0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
145c0 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
145d0 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64   fsync(). Second
145e0 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20  .  ** iteration 
145f0 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73  (which only runs
14600 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66 61   if the first fa
14610 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65  iled to free nRe
14620 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20  q bytes of.  ** 
14630 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69  memory) is permi
14640 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79  tted to call fsy
14650 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66  nc(). This is of
14660 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72   course much mor
14670 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76  e .  ** expensiv
14680 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
14690 30 3b 20 69 3d 3d 30 20 7c 7c 20 69 3d 3d 31 3b  0; i==0 || i==1;
146a0 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c   i++){..    /* L
146b0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
146c0 74 68 65 20 53 51 4c 69 74 65 20 70 61 67 65 72  the SQLite pager
146d0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
146e0 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20  current thread. 
146f0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 73  */.    for(p=pTs
14700 64 2d 3e 70 50 61 67 65 72 3b 20 70 20 26 26 20  d->pPager; p && 
14710 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
14720 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 3d 70 2d  ased<nReq); p=p-
14730 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50  >pNext){.      P
14740 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
14750 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
14760 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61 67 65  /* For each page
14770 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65 20 61  r, try to free a
14780 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20  s many pages as 
14790 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75  possible (withou
147a0 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  t .      ** call
147b0 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66 20 74  ing fsync() if t
147c0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
147d0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
147e0 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20  e outermost .   
147f0 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20     ** loop)..   
14800 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c     */.      whil
14810 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  e( SQLITE_OK==(r
14820 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
14830 65 28 70 2c 20 69 2c 20 26 70 50 67 29 29 20 26  e(p, i, &pPg)) &
14840 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20  & pPg) {.       
14850 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
14860 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
14870 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
14880 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
14890 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
148a0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
148b0 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
148c0 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
148d0 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20  ed-list .       
148e0 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65   ** (pFirstSynce
148f0 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20  d). It is still 
14900 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73  in the all pages
14910 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20   (pAll) list. . 
14920 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65         ** Remove
14930 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
14940 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
14950 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g..        **.  
14960 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43        ** Todo: C
14970 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70  heck the Pager.p
14980 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b  Stmt list to mak
14990 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f  e sure this is O
149a0 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a  k. It .        *
149b0 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68  * probably is th
149c0 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ough..        */
149d0 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
149e0 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  pTmp;.        as
149f0 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
14a00 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
14a10 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
14a20 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pPg);.        if
14a30 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29  ( pPg==p->pAll )
14a40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  {.           p->
14a50 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
14a60 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  tAll;.        }e
14a70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
14a80 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c  or( pTmp=p->pAll
14a90 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  ; pTmp->pNextAll
14aa0 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70  !=pPg; pTmp=pTmp
14ab0 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 3b 0a 20 20  ->pNextAll );.  
14ac0 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e          pTmp->pN
14ad0 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  extAll = pPg->pN
14ae0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20  extAll;.        
14af0 7d 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61  }.        nRelea
14b00 73 65 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c  sed += sqliteAll
14b10 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a 20 20 20  ocSize(pPg);.   
14b20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
14b30 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pPg);.      }.. 
14b40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14b60 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63    /* An error oc
14b70 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
14b80 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
14b90 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20  base file or .  
14ba0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
14bb0 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c   in pager_recycl
14bc0 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69  e(). The error i
14bd0 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74  s not returned t
14be0 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
14bf0 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73  * caller of this
14c00 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65   function. Inste
14c10 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ad, set the Page
14c20 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
14c30 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  le..        ** T
14c40 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
14c50 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
14c60 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
14c70 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
14c80 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68        ** of a sh
14c90 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65  ared pager cache
14ca0 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  ) of the pager f
14cb0 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72  or which the err
14cc0 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  or occured..    
14cd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
14ce0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
14cf0 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53  E_IOERR || rc==S
14d00 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20  QLITE_FULL );.  
14d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
14d20 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
14d30 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
14d40 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c    pager_error(p,
14d50 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
14d60 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
14d70 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
14d80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14d90 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  OMIT_MEMORY_MANA
14da0 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
14db0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
14dc0 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
14dd0 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
14de0 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
14df0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
14e00 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
14e10 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
14e20 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
14e30 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
14e40 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
14e50 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b  *.** A _get work
14e60 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e  s for any page n
14e70 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
14e80 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61  an 0.  If the da
14e90 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
14ea0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
14eb0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
14ec0 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61  e, then no actua
14ed0 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f  l disk.** read o
14ee0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65  ccurs and the me
14ef0 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
14f00 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  e page is initia
14f10 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20  lized to.** all 
14f20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72  zeros.  The extr
14f30 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
14f40 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
14f50 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ays initialized.
14f60 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ** to zeros the 
14f70 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
14f80 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
14f90 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
14fa0 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
14fb0 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
14fc0 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
14fd0 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
14fe0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
14ff0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
15000 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
15010 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
15020 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
15030 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  o sqlite3pager_l
15040 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
15050 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
15060 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70  _lookup() attemp
15070 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
15080 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
15090 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
150a0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
150b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
150c0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
150d0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
150e0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
150f0 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f   in whereas _loo
15100 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
15110 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
15120 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
15130 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
15140 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
15150 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
15160 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
15170 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
15180 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
15190 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
151a0 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  e _lookup() neve
151b0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
151c0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
151d0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
151e0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
151f0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
15200 74 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67  te3pager_get(Pag
15210 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
15220 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70   pgno, void **pp
15230 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
15240 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
15250 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
15260 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
15270 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
15280 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
15290 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
152a0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
152b0 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
152c0 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
152d0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
152e0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
152f0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
15300 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15310 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
15320 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
15330 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
15340 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
15350 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
15360 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
15370 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
15380 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
15390 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
153a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
153b0 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52  sk & ~(PAGER_ERR
153c0 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65  _FULL) ){.    re
153d0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
153e0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
153f0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
15400 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
15410 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
15420 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
15430 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
15440 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
15450 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
15460 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  Ref==0 && !MEMDB
15470 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
15480 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
15490 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
154a0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
154b0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
154c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
154d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
154e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
154f0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
15500 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
15510 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
15520 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
15530 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
15540 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
15550 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
15560 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
15570 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
15580 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
15590 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
155a0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
155b0 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75     if( hasHotJou
155c0 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  rnal(pPager) ){.
155d0 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a         int rc;..
155e0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
155f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
15600 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15610 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
15620 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
15630 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
15640 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
15650 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
15660 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
15670 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45   the.       ** E
15680 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
15690 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
156a0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
156b0 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
156c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
156d0 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
156e0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
156f0 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
15700 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
15710 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
15720 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
15730 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
15740 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
15750 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
15760 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
15770 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
15780 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
15790 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
157a0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
157b0 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
157c0 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
157d0 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
157e0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
157f0 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a  fail to.       *
15800 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
15810 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
15820 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15830 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f   file..       */
15840 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
15850 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
15860 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
15870 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69  _LOCK);.       i
15880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   ){.         sql
158a0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
158b0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
158c0 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
158d0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
158e0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
158f0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
15900 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15910 29 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  );.       }.    
15920 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
15930 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
15940 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f  VE;..       /* O
15950 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
15960 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
15970 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
15980 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
15990 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
159a0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
159b0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
159c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20     **.       ** 
159d0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
159e0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
159f0 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65  o be locked itse
15a00 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  lf.  The.       
15a10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
15a20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e  is never open un
15a30 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61  less the main da
15a40 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
15a50 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  s.       ** a wr
15a60 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
15a70 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
15a80 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
15a90 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20   more.       ** 
15aa0 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e  processes openin
15ab0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74  g the journal at
15ac0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
15ad0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 2e   rc = sqlite3Os.
15af0 78 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50  xOpenReadOnly(pP
15b00 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
15b10 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
15b20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15b40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
15b50 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
15b60 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
15b70 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
15b80 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
15b90 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
15ba0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
15bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
15bc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
15bd0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50  n = 1;.       pP
15be0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
15bf0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
15c00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15c10 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
15c20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
15c30 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  r = 0;.       pP
15c40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15c50 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a   = 0;..       /*
15c60 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
15c70 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
15c80 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
15c90 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
15ca0 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
15cb0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
15cc0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
15cd0 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  .       rc = pag
15ce0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
15cf0 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  er);.       if( 
15d00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15d10 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
15d20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
15d30 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
15d40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
15d50 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
15d60 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
15d70 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a   page in cache *
15d80 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
15d90 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
15da0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
15db0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
15dc0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
15dd0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
15de0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
15df0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
15e00 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  }.  }.  if( pPg=
15e10 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
15e20 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
15e30 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
15e40 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
15e50 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54   int h;.    TEST
15e60 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
15e70 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50  iss);.    if( pP
15e80 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67  ager->nPage<pPag
15e90 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50  er->mxPage || pP
15ea0 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20  ager->pFirst==0 
15eb0 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  || MEMDB ){.    
15ec0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
15ed0 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  w page */.      
15ee0 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pPg = sqliteMall
15ef0 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
15f00 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
15f10 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  geSize.         
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
15f40 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
15f50 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
15f80 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
15f90 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
15fa0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
15fb0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
15fd0 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
15fe0 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
15ff0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
16000 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
16010 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
16020 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a   pPager), 0, siz
16030 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b  eof(PgHistory));
16040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
16050 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
16060 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ger;.      pPg->
16070 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
16080 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70  r->pAll;.      p
16090 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
160a0 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  g;.      pPager-
160b0 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
160c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
160d0 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  e>pPager->nMaxPa
160e0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ge ){.        as
160f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d  sert( pPager->nM
16100 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d  axPage==(pPager-
16110 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20  >nPage-1) );.   
16120 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61       pPager->nMa
16130 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d  xPage++;.      }
16140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16150 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
16160 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20  ycle(pPager, 1, 
16170 26 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  &pPg);.      if(
16180 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16190 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
161a0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
161b0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
161c0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
161d0 50 67 29 20 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Pg) ;.    }.    
161e0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
161f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
16200 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
16210 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
16220 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
16230 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
16240 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
16250 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
16260 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73  no/8);.      ass
16270 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
16280 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
16290 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
162a0 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
162b0 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
162c0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
162d0 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
162e0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
162f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
16300 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
16310 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
16320 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
16330 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
16340 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  >aInStmt && (int
16350 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
16360 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20  tmtSize.        
16370 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
16380 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d  >aInStmt[pgno/8]
16390 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
163a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  )!=0 ){.      pa
163b0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
163c0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ist(pPg);.    }e
163d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  lse{.      page_
163e0 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
163f0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
16400 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  }.    pPg->dirty
16410 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 0;.    pPg->n
16420 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
16430 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70  INFO(pPg);.    p
16440 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
16450 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73     h = pager_has
16460 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67  h(pgno);.    pPg
16470 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
16480 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
16490 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
164a0 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
164b0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
164c0 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
164d0 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
164e0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
164f0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
16500 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
16510 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
16520 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
16530 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
16540 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
16550 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
16560 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
16570 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
16580 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
16590 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
165a0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
165b0 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
165c0 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
165d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
165e0 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
165f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
16610 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
16620 6f 75 6e 74 28 70 50 61 67 65 72 29 3c 28 69 6e  ount(pPager)<(in
16630 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  t)pgno ){.      
16640 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
16650 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
16660 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16670 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16680 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
16690 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30  assert( MEMDB==0
166a0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
166b0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
166c0 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
166d0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
166e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
166f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
16710 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16720 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
16730 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
16760 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
16780 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20  RACE3("FETCH %d 
16790 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
167a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
167b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
167c0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
167d0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
167e0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
167f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16810 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a 65 3b     i64 fileSize;
16820 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
16830 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
16840 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53  Pager->fd,&fileS
16850 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ize)!=SQLITE_OK.
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16870 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f  | fileSize>=pgno
16880 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
16890 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
168a0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
168b0 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
168c0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  pPg));.         
168d0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
168e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
168f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16900 20 20 20 20 20 20 20 20 20 20 63 6c 65 61 72 5f            clear_
16910 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
16920 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  or();.          
16930 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
16940 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
16950 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16980 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
16990 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  ->nRead);.      
169a0 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
169b0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
169c0 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
169d0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
169e0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
169f0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
16a00 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
16a10 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
16a20 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
16a30 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
16a40 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70  er->nHit);.    p
16a50 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
16a60 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
16a70 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16a80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16a90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
16aa0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
16ab0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
16ac0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
16ad0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
16ae0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
16af0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
16b00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
16b10 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
16b20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
16b30 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
16b40 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
16b50 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
16b60 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
16b70 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
16b80 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
16b90 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
16ba0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
16bb0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
16bc0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
16bd0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
16be0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
16bf0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
16c00 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
16c10 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
16c20 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
16c30 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
16c40 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
16c50 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
16c60 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  appened..*/.void
16c70 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c   *sqlite3pager_l
16c80 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
16c90 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
16ca0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
16cb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16cc0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
16cd0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66   pgno!=0 );.  if
16ce0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
16cf0 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
16d00 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
16d10 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  urn 0;.  }.  pPg
16d20 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
16d30 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
16d40 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
16d50 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
16d60 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
16d70 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
16d80 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
16d90 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
16da0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
16db0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
16dc0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
16dd0 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
16de0 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
16df0 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
16e00 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
16e10 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
16e20 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
16e30 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
16e40 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
16e50 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
16e60 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
16e70 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
16e80 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
16e90 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
16ea0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
16eb0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
16ec0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
16ed0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
16ee0 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41   */.  pPg = DATA
16ef0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
16f00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
16f10 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67  >nRef>0 );.  pPg
16f20 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49  ->nRef--;.  REFI
16f30 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45  NFO(pPg);..  CHE
16f40 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
16f50 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
16f60 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
16f70 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
16f80 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
16f90 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
16fa0 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
16fb0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
16fc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
16fd0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50  nRef==0 ){.    P
16fe0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
16ff0 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
17000 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
17010 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a  >pNextFree = 0;.
17020 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
17030 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61  ee = pPager->pLa
17040 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
17050 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  pLast = pPg;.   
17060 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
17070 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
17080 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
17090 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20  xtFree = pPg;.  
170a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
170b0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
170c0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
170d0 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
170e0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
170f0 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29  FirstSynced==0 )
17100 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
17110 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
17120 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
17130 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
17140 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70  uctor ){.      p
17150 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
17160 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
17170 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17180 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
17190 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
171a0 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
171b0 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
171c0 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
171d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
171e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
171f0 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
17200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17210 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
17220 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
17230 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b  ==0 && !MEMDB ){
17240 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
17250 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
17260 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
17270 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17280 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
17290 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
172a0 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
172b0 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
172c0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
172d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
172e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
172f0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
17300 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
17310 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
17320 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
17330 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
17340 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
17350 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
17360 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
17370 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
17380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17390 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
173a0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
173b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
173c0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
173d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
173e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
173f0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
17400 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
17410 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
17420 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17430 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
17440 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17450 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
17460 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
17470 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
17480 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
17490 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
174a0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
174b0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
174c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
174d0 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  aInJournal==0 ){
174e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
174f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
17500 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
17510 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72  journal;.  }.  r
17520 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 2e 78 4f  c = sqlite3Os.xO
17530 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
17540 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
17550 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20  pPager->jfd,.   
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
17580 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
17590 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
175a0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
175b0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
175c0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
175d0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
175e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
175f0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61  K ){.    goto fa
17600 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
17610 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rnal;.  }.  sqli
17620 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63  te3OsSetFullSync
17630 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
17640 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b  ager->fullSync);
17650 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46  .  sqlite3OsSetF
17660 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  ullSync(pPager->
17670 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
17680 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
17690 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
176a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
176b0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
176c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
176d0 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
176e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
176f0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
17700 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
17710 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
17720 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
17730 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
17740 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
17750 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
17760 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
17770 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
17780 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
17790 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
177a0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
177b0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
177c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
177d0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
177e0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  lHdr(pPager);.. 
177f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
17800 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
17810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
17830 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70  ger_stmt_begin(p
17840 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
17850 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17860 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
17870 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MEM ){.    rc = 
17880 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
17890 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
178a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
178b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
178c0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
178d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
178e0 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
178f0 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
17900 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
17910 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
17920 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
17930 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  al = 0;.  if( rc
17940 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
17950 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
17960 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20   was a malloc() 
17970 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77 65  failure, then we
17980 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f   will not be clo
17990 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a 20  sing the pager. 
179a0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64     ** file. So d
179b0 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61  elete any journa
179c0 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68 61  l file we may ha
179d0 76 65 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e  ve just created.
179e0 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
179f0 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77 69  ** the system wi
17a00 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64 2c  ll get confused,
17a10 20 77 65 20 68 61 76 65 20 61 20 72 65 61 64 2d   we have a read-
17a20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
17a30 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79   and a.    ** my
17a40 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  sterious journal
17a50 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69 6e   has appeared in
17a60 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e   the filesystem.
17a70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
17a80 74 65 33 4f 73 2e 78 44 65 6c 65 74 65 28 70 50  te3Os.xDelete(pP
17a90 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
17aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
17ab0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
17ac0 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
17ad0 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
17ae0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
17af0 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LOCK;.  }.  retu
17b00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17b10 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
17b20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17b30 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
17b40 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
17b50 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
17b60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
17b70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
17b80 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
17b90 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  it() is called..
17ba0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
17bb0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
17bc0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
17bd0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
17be0 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
17bf0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
17c00 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20  e3pager_unref() 
17c10 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
17c20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
17c30 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
17c40 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
17c50 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
17c60 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
17c70 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
17c80 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
17c90 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
17ca0 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
17cb0 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
17cc0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
17cd0 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
17ce0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
17cf0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
17d00 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
17d10 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
17d20 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
17d30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17d40 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
17d50 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
17d60 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
17d70 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
17d80 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
17d90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17da0 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
17db0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
17dc0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
17dd0 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
17de0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
17df0 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
17e00 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
17e10 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
17e20 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
17e30 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
17e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
17e50 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
17e60 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
17e70 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
17e80 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
17e90 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
17ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
17eb0 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
17ec0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
17ed0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17ee0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
17ef0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
17f00 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
17f10 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
17f20 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
17f30 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
17f40 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
17f50 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
17f60 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
17f70 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
17f80 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
17f90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
17fa0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
17fb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
17fc0 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
17fd0 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c  *pData, int exFl
17fe0 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
17ff0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
18000 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
18010 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18020 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
18030 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18040 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
18050 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
18060 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18070 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
18080 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
18090 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
180a0 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
180b0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
180c0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
180d0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
180e0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
180f0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
18100 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
18110 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
18120 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
18130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18140 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
18150 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
18160 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
18170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18190 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
181a0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
181b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46  .        if( exF
181c0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
181d0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
181e0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
181f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
18200 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18210 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
18220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18230 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18250 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
18260 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  he = 0;.      TR
18270 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
18280 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
18290 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
182a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
182b0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
182c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
182d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
182e0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
182f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
18300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18320 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
18330 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
18340 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
18350 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
18360 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
18370 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
18380 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
18390 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
183a0 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
183b0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
183c0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
183d0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
183e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
183f0 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
18400 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
18410 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
18420 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
18430 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
18440 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
18450 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
18460 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
18470 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
18480 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
18490 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
184a0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
184b0 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
184c0 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
184d0 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
184e0 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
184f0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
18500 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
18510 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
18520 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
18530 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
18540 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
18550 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
18560 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
18570 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
18580 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
18590 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
185a0 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
185b0 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
185c0 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
185d0 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
185e0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
185f0 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
18600 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
18610 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
18620 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65 72   or sqlite3pager
18630 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  _rollback() to.*
18640 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  * reset..*/.int 
18650 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
18660 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  te(void *pData){
18670 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
18680 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
18690 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
186a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
186b0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
186c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
186d0 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
186e0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
186f0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20  ger->errMask ){ 
18700 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
18710 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
18720 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
18730 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
18740 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18750 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
18760 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
18770 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
18780 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
18790 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
187a0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
187b0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
187c0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
187d0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
187e0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
187f0 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
18800 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
18810 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
18820 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
18830 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e  rnal && (pPg->in
18840 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Stmt || pPager->
18850 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  stmtInUse==0) ){
18860 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
18870 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d  tyCache = 1;.  }
18880 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
18890 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
188a0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
188b0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
188c0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
188d0 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
188e0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
188f0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
18900 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
18910 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
18920 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
18930 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
18940 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
18950 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
18960 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
18970 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
18980 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
18990 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
189a0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
189b0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
189c0 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e  lite3pager_begin
189d0 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20  (pData, 0);.    
189e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
189f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
18a00 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18a10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18a20 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
18a30 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28  ERVED );.    if(
18a40 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
18a50 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
18a60 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
18a70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18a80 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
18a90 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
18aa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18ac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18ad0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18ae0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65   || !pPager->use
18af0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
18b00 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
18b10 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  e = 1;.  .    /*
18b20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
18b30 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
18b40 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
18b50 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
18b60 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
18b70 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
18b80 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
18b90 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
18ba0 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
18bb0 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
18bc0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
18bd0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
18be0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
18bf0 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a     if( !pPg->inJ
18c00 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
18c10 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  r->useJournal ||
18c20 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20   MEMDB) ){.     
18c30 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
18c40 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
18c50 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
18c60 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20       int szPg;. 
18c70 20 20 20 20 20 20 20 75 33 32 20 73 61 76 65 64         u32 saved
18c80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  ;.        if( ME
18c90 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
18ca0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
18cb0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
18cc0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
18cd0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 33            TRACE3
18ce0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
18cf0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
18d00 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
18d10 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
18d20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
18d30 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Orig==0 );.     
18d40 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
18d50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
18d60 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
18d70 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
18d80 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
18d90 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
18da0 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
18db0 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
18dc0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
18dd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18de0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e00 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
18e10 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
18e20 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
18e30 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
18e40 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
18e50 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
18e60 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
18e70 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
18e80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
18e90 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
18ea0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
18eb0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
18ec0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18ed0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
18ee0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
18ef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44  );.          COD
18f00 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
18f10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
18f20 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
18f30 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
18f40 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
18f50 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
18f60 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33      saved = *(u3
18f70 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  2*)PGHDR_TO_EXTR
18f80 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  A(pPg, pPager);.
18f90 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 33            store3
18fa0 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
18fb0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18fc0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
18fd0 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  zPg = pPager->pa
18fe0 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20  geSize+8;.      
18ff0 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28      store32bits(
19000 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20  pPg->pgno, pPg, 
19010 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  -4);.          r
19020 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
19030 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
19040 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b  &((char*)pData)[
19050 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20  -4], szPg);.    
19060 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
19070 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67  urnalOff += szPg
19080 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
19090 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E4("JOURNAL %d p
190a0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
190b0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
190c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
190d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
190e0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
190f0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43  nc);.          C
19100 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
19110 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30  ta, pPg->pgno, 0
19120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75  );.          *(u
19130 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
19140 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 20  RA(pPg, pPager) 
19150 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  = saved;.       
19160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19180 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
19190 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
191a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
191b0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
191c0 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  = PAGER_ERR_FULL
191d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
191e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
191f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
19200 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
19210 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19220 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19230 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
19240 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
19250 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
19260 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
19270 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
19280 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
19290 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
192a0 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
192b0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
192c0 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
192d0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
192e0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
192f0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
19300 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &7);.           
19310 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
19320 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
19330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19340 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
19350 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
19360 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
19370 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
19380 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
19390 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  nc;.        TRAC
193a0 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E4("APPEND %d pa
193b0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
193c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
193d0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
193e0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
193f0 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
19400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19410 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
19420 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
19430 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
19440 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
19450 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
19460 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 1;.    }.  .  
19470 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
19480 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
19490 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
194a0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
194b0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
194c0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
194d0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
194e0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
194f0 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
19500 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
19510 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
19520 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
19530 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
19540 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
19550 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
19560 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
19570 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
19580 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
19590 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
195a0 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
195b0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
195c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
195d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
195e0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
195f0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
19600 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
19610 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  bSize );.      i
19620 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
19630 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
19640 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
19650 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
19660 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
19670 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
19680 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  =0 );.        pH
19690 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
196a0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
196b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
196c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
196d0 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
196e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
196f0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
19700 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
19710 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19720 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
19730 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
19740 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
19750 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
19760 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19770 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pgno);.      }el
19780 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  se{.        stor
19790 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e  e32bits(pPg->pgn
197a0 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20  o, pPg, -4);.   
197b0 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
197c0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
197d0 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
197e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
197f0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  rite(pPager->stf
19800 64 2c 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  d,((char*)pData)
19810 2d 34 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -4,.            
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
19840 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  ize+4);.        
19850 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
19860 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
19870 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19880 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
19890 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
198a0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
198b0 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
198c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
198d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
198e0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
198f0 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
19900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
19910 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
19920 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
19930 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19940 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
19950 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
19960 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
19970 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19980 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
19990 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
199a0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
199b0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
199c0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
199d0 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64   }.      page_ad
199e0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
199f0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
19a00 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
19a10 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
19a20 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
19a30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
19a40 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
19a50 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
19a60 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
19a70 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
19a80 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
19a90 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
19aa0 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
19ab0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
19ac0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
19ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19ae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19af0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
19b00 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
19b10 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
19b20 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
19b30 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
19b40 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e  e3pager_write().
19b50 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
19b60 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
19b70 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
19b80 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
19b90 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
19ba0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19bb0 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
19bc0 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
19bd0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
19be0 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
19bf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
19c00 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23 69 66 6e 64  >dirty;.}..#ifnd
19c10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19c20 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c  ACUUM./*.** Repl
19c30 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ace the content 
19c40 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
19c50 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d   with the inform
19c60 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69  ation in the thi
19c70 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  rd.** argument..
19c80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19c90 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61  ger_overwrite(Pa
19ca0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19cb0 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
19cc0 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ata){.  void *pP
19cd0 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  age;.  int rc;..
19ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
19cf0 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
19d00 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20  pgno, &pPage);. 
19d10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19d20 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
19d30 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
19d40 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
19d50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19d60 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
19d70 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70 50  pPage, pData, pP
19d80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19d90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19da0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
19db0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
19dc0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
19dd0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
19de0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
19df0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
19e00 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
19e10 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
19e20 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
19e30 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
19e40 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
19e50 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
19e60 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
19e70 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
19e80 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
19e90 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
19ea0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
19eb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
19ec0 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
19ed0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
19ee0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
19ef0 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
19f00 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
19f10 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
19f20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
19f30 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
19f40 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
19f50 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
19f60 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
19f70 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
19f80 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
19f90 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  _rollback() belo
19fa0 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
19fb0 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
19fc0 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
19fd0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
19fe0 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
19ff0 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1a000 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1a010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a020 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1a030 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1a040 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1a050 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1a060 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65  s to sqlite3page
1a070 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
1a080 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
1a090 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
1a0a0 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
1a0b0 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
1a0c0 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
1a0d0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
1a0e0 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
1a0f0 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
1a100 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1a110 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
1a120 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
1a130 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
1a140 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
1a150 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
1a160 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
1a170 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
1a180 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
1a190 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
1a1a0 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
1a1b0 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
1a1c0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
1a1d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a1e0 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
1a1f0 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72  d,.** the dont_r
1a200 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1a210 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1a220 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  t because the pa
1a230 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63  ge contains.** c
1a240 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1a250 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1a260 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72  e sure it gets r
1a270 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
1a280 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f  ite.** of the do
1a290 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61  nt_rollback() ca
1a2a0 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
1a2b0 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72  te3pager_dont_wr
1a2c0 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
1a2d0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1a2e0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1a2f0 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1a300 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
1a310 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1a320 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e  , pgno);.  pPg->
1a330 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1a340 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26   1;.  if( pPg &&
1a350 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21   pPg->dirty && !
1a360 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1a370 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1a380 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
1a390 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
1a3a0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a3b0 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
1a3c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1a3d0 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
1a3e0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
1a3f0 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
1a400 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
1a410 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
1a420 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1a430 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
1a440 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
1a450 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
1a460 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
1a470 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
1a480 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
1a490 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
1a4a0 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
1a4b0 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
1a4c0 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
1a4d0 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
1a4e0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
1a4f0 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
1a500 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
1a510 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
1a520 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
1a530 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
1a540 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
1a550 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
1a560 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
1a570 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1a580 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
1a590 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
1a5a0 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
1a5b0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1a5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
1a5d0 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54  RACE3("DONT_WRIT
1a5e0 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
1a5f0 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49  n", pgno, PAGERI
1a600 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1a610 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1a620 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a630 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1a640 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
1a650 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1a660 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
1a670 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1a680 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1a690 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1a6a0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
1a6b0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1a6c0 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
1a6d0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
1a6e0 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
1a6f0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
1a700 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
1a710 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
1a720 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
1a730 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
1a740 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
1a750 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a760 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a770 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
1a780 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
1a790 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1a7a0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1a7b0 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
1a7c0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1a7d0 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
1a7e0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1a7f0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
1a800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a810 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
1a820 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
1a830 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
1a840 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1a850 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20  back || MEMDB ) 
1a860 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
1a870 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1a880 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
1a890 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
1a8a0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
1a8b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1a8c0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1a8d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1a8e0 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
1a8f0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1a900 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
1a910 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1a920 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1a930 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1a940 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1a950 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1a960 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1a970 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
1a980 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1a990 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
1a9a0 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
1a9b0 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
1a9c0 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1a9d0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1a9e0 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  r));.  }.  if( p
1a9f0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1aa00 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
1aa10 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1aa20 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
1aa30 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
1aa40 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1aa50 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1aa60 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1aa70 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
1aa80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1aa90 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1aaa0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1aab0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1aac0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1aad0 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
1aae0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1aaf0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64  );.  }.}...#ifnd
1ab00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
1ab10 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
1ab20 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
1ab30 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
1ab40 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
1ab50 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
1ab60 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
1ab70 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
1ab80 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
1ab90 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
1aba0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
1abb0 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
1abc0 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
1abd0 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
1abe0 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
1abf0 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1ac00 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1ac10 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
1ac20 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1ac30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1ac40 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
1ac50 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
1ac60 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
1ac70 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
1ac80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ac90 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
1aca0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
1acb0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1acc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1acd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
1ace0 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
1acf0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1ad00 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1ad10 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
1ad20 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask==PAGER_ERR_F
1ad30 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
1ad40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
1ad50 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1ad60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ad70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1ad80 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1ad90 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1ada0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
1adb0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
1adc0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
1add0 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
1ade0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
1adf0 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
1ae00 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
1ae10 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
1ae20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ae30 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41  ERROR;.  }.  TRA
1ae40 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
1ae50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1ae60 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1ae70 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
1ae80 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1ae90 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1aea0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
1aeb0 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  ){.      clearHi
1aec0 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
1aed0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1aee0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
1aef0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1af00 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1af10 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
1af20 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1af30 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
1af40 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
1af50 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
1af60 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
1af70 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
1af80 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
1af90 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
1afa0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
1afb0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
1afc0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1afd0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1afe0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1aff0 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
1b000 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
1b010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1b020 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
1b030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1b040 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
1b050 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b060 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1b070 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1b080 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1b090 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1b0a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1b0b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72   if( pPager->dir
1b0c0 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20  tyCache==0 ){.  
1b0d0 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20    /* Exit early 
1b0e0 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74  (without doing t
1b0f0 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e  he time-consumin
1b100 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  g sqlite3OsSync(
1b110 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20  ) calls).    ** 
1b120 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
1b130 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
1b140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b150 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
1b160 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1b170 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ync==0 );.    rc
1b180 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1b190 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1b1a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1b1b0 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
1b1c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1b1d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1b1e0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
1b1f0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
1b200 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ync(pPager, 0, 0
1b210 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1b220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1b230 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
1b240 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
1b250 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
1b260 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
1b270 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
1b280 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1b290 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e   Jump here if an
1b2a0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
1b2b0 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  g during the com
1b2c0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  mit process..  *
1b2d0 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a  /.commit_abort:.
1b2e0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
1b2f0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1b300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b310 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1b320 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
1b330 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
1b340 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
1b350 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
1b360 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
1b370 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
1b380 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
1b390 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
1b3a0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1b3b0 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
1b3c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1b3d0 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
1b3e0 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
1b3f0 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
1b400 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
1b410 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
1b420 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52  tocol (SQLITE_PR
1b430 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73  OTOCOL) or unles
1b440 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
1b450 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
1b460 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
1b470 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1b480 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
1b490 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
1b4a0 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
1b4b0 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
1b4c0 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
1b4d0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
1b4e0 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
1b4f0 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
1b500 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
1b510 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
1b520 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1b530 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1b540 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
1b550 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1b560 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f  rc;.  TRACE2("RO
1b570 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
1b580 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1b590 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1b5a0 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1b5b0 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
1b5c0 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
1b5d0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
1b5e0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
1b5f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1b600 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1b610 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
1b620 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
1b630 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
1b640 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
1b650 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
1b660 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
1b670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1b680 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1b690 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1b6a0 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
1b6b0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
1b6c0 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
1b6d0 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
1b6e0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
1b6f0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
1b700 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1b710 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
1b720 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
1b730 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
1b740 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1b750 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
1b760 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
1b770 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
1b780 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1b790 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
1b7a0 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  e{.        TRACE
1b7b0 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c  3("PAGE %d is cl
1b7c0 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d  ean on %d\n", p-
1b7d0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1b7e0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
1b7f0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1b800 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
1b810 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a    p->dirty = 0;.
1b820 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e        p->inJourn
1b830 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  al = 0;.      p-
1b840 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
1b850 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20     p->pPrevStmt 
1b860 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  = p->pNextStmt =
1b870 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   0;..      if( p
1b880 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1b890 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1b8a0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
1b8b0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
1b8c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b8d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b8e0 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
1b8f0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
1b900 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1b910 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  e = pPager->orig
1b920 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f  DbSize;.    memo
1b930 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
1b940 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1b950 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
1b960 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1b970 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
1b980 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b990 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
1b9a0 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
1b9b0 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
1b9c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
1b9d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1b9e0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
1b9f0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1ba00 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
1ba10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1ba20 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1ba30 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50  errMask!=0 && pP
1ba40 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50  ager->errMask!=P
1ba50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
1ba60 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ba70 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
1ba80 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
1ba90 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1baa0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1bab0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
1bac0 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
1bad0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1bae0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1baf0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
1bb00 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20  int rc2;.    rc 
1bb10 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  = pager_reload_c
1bb20 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
1bb30 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e    rc2 = pager_un
1bb40 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1bb50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1bb60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bb70 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1bb80 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
1bb90 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1bba0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
1bbb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bbc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1bbd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bbe0 4b 50 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  KPT;.    pPager-
1bbf0 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
1bc00 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
1bc10 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
1bc20 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
1bc30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bc40 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1bc50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bc60 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
1bc70 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
1bc80 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
1bc90 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
1bca0 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
1bcb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1bcc0 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50  ger_isreadonly(P
1bcd0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1bce0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1bcf0 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
1bd00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bd10 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1bd20 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
1bd30 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
1bd40 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
1bd50 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
1bd60 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
1bd70 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
1bd80 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
1bd90 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
1bda0 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
1bdb0 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
1bdc0 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
1bdd0 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
1bde0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
1bdf0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
1be00 65 72 72 4d 61 73 6b 3b 0a 23 69 66 64 65 66 20  errMask;.#ifdef 
1be10 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 61 5b  SQLITE_TEST.  a[
1be20 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
1be30 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
1be40 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
1be50 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66  ] = pPager->nOvf
1be60 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  l;.  a[9] = pPag
1be70 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
1be80 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
1be90 69 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ite;.#endif.  re
1bea0 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn a;.}../*.**
1beb0 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
1bec0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
1bed0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
1bee0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
1bef0 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
1bf00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1bf10 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
1bf20 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
1bf30 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
1bf40 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
1bf50 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
1bf60 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
1bf70 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
1bf80 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
1bf90 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
1bfa0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1bfb0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62  ite3pager_stmt_b
1bfc0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
1bfd0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1bfe0 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
1bff0 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
1c000 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ];.  assert( !pP
1c010 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1c020 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1c030 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
1c040 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d 54  ;.  TRACE2("STMT
1c050 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41  -BEGIN %d\n", PA
1c060 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1c070 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1c080 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1c090 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  nUse = 1;.    pP
1c0a0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
1c0b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1c0c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c0d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1c0e0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1c0f0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61  lOpen ){.    pPa
1c100 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1c110 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  n = 1;.    retur
1c120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c130 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c140 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1c150 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ;.  pPager->aInS
1c160 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
1c170 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
1c180 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
1c190 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1c1a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  t==0 ){.    /* s
1c1b0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1c1c0 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
1c1d0 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  LOCK); */.    re
1c1e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1c1f0 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
1c200 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
1c210 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1c220 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
1c230 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
1c240 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1c250 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
1c260 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
1c270 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1c280 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
1c290 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
1c2a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
1c2b0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
1c2c0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
1c2d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
1c2e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1c2f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
1c300 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
1c310 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
1c320 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
1c330 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1c340 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
1c350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1c360 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
1c370 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64  p, &pPager->stfd
1c380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1c390 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1c3a0 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
1c3b0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
1c3c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1c3d0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
1c3e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1c3f0 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
1c400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
1c410 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
1c420 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
1c430 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
1c440 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
1c450 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
1c460 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1c470 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1c480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1c490 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
1c4a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1c4b0 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
1c4c0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
1c4d0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1c4e0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1c4f0 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
1c500 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32  Next;.    TRACE2
1c510 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
1c520 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c530 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
1c540 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
1c550 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
1c560 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
1c570 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
1c580 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
1c590 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
1c5a0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1c5b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c5c0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
1c5d0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
1c5e0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67     }.    for(pPg
1c5f0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
1c600 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
1c610 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
1c620 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
1c630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1c640 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
1c650 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
1c660 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1c670 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1c680 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1c690 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1c6a0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1c6b0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1c6c0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1c6d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1c6e0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
1c6f0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
1c700 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1c710 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c720 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
1c730 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
1c740 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c750 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
1c760 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
1c770 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
1c780 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
1c790 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c7a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1c7b0 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
1c7c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1c7d0 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61  ager_stmt_rollba
1c7e0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1c7f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1c800 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1c810 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43  nUse ){.    TRAC
1c820 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
1c830 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
1c840 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
1c850 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1c860 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1c870 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1c880 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
1c890 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74  pPg=pPg->pNextSt
1c8a0 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  mt){.        PgH
1c8b0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1c8c0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1c8d0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1c8e0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
1c8f0 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
1c900 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
1c910 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
1c920 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
1c930 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1c940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
1c950 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
1c960 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1c970 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
1c980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c990 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c9a0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
1c9b0 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d  tmtSize;.      m
1c9c0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
1c9d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
1c9e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c9f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1ca00 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
1ca10 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
1ca20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ca30 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
1ca40 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
1ca50 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
1ca60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1ca70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
1ca80 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
1ca90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1caa0 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
1cab0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
1cac0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1cad0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1cae0 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61  ite3pager_filena
1caf0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1cb00 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1cb10 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
1cb20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cb30 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
1cb40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cb50 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
1cb60 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64   *sqlite3pager_d
1cb70 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
1cb80 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1cb90 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
1cba0 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
1cbb0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
1cbc0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
1cbd0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
1cbe0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1cbf0 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61  3pager_journalna
1cc00 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1cc10 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1cc20 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
1cc30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1cc40 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
1cc50 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
1cc60 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
1cc70 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
1cc80 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
1cc90 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
1cca0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
1ccb0 74 65 33 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28  te3pager_nosync(
1ccc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ccd0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1cce0 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  >noSync;.}../*.*
1ccf0 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
1cd00 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
1cd10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1cd20 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20  ger_set_codec(. 
1cd30 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
1cd40 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29    void (*xCodec)
1cd50 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
1cd60 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  o,int),.  void *
1cd70 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70  pCodecArg.){.  p
1cd80 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
1cd90 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
1cda0 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43  ->pCodecArg = pC
1cdb0 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  odecArg;.}../*.*
1cdc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1cdd0 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
1cde0 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61  ement the databa
1cdf0 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63  se file change-c
1ce00 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65  ounter,.** store
1ce10 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20  d at byte 24 of 
1ce20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
1ce30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ce40 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1ce50 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50  ounter(Pager *pP
1ce60 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70  ager){.  void *p
1ce70 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70  Page;.  PgHdr *p
1ce80 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
1ce90 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
1cea0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65  nt rc;..  /* Ope
1ceb0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
1cec0 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
1ced0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
1cee0 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
1cef0 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b  ger, 1, &pPage);
1cf00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1cf10 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1cf20 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1cf30 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1cf40 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1cf50 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1cf60 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   rc;..  /* Read 
1cf70 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
1cf80 65 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f  e at byte 24. */
1cf90 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41 54 41  .  pPgHdr = DATA
1cfa0 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29  _TO_PGHDR(pPage)
1cfb0 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  ;.  change_count
1cfc0 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62  er = retrieve32b
1cfd0 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b  its(pPgHdr, 24);
1cfe0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1cff0 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1d000 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1d010 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1d020 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
1d030 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72  ounter++;.  stor
1d040 65 33 32 62 69 74 73 28 63 68 61 6e 67 65 5f 63  e32bits(change_c
1d050 6f 75 6e 74 65 72 2c 20 70 50 67 48 64 72 2c 20  ounter, pPgHdr, 
1d060 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  24);..  /* Relea
1d070 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
1d080 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  rence. */.  sqli
1d090 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1d0a0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
1d0b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1d0c0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1d0d0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1d0e0 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1d0f0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1d100 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1d110 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1d120 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1d130 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1d140 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1d150 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1d160 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1d170 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1d180 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1d190 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1d1a0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1d1b0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1d1c0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1d1d0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1d1e0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1d1f0 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1d200 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1d210 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1d220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d230 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1d240 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1d250 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1d260 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1d270 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1d280 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1d290 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1d2a0 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1d2b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1d2c0 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1d2d0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1d2e0 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1d2f0 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1d300 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1d310 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1d320 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70  d to an sqlite3p
1d330 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c  ager_sync() call
1d340 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1d350 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e  eter nTrunc is n
1d360 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
1d370 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
1d380 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20  truncated to.** 
1d390 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68  nTrunc pages (th
1d3a0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75  is is used by au
1d3b0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1d3c0 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ses)..*/.int sql
1d3d0 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50  ite3pager_sync(P
1d3e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
1d3f0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1d400 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
1d410 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d420 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34  TE_OK;..  TRACE4
1d430 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
1d440 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
1d450 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
1d460 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1d470 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
1d480 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20  ter, nTrunc);.. 
1d490 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1d4a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
1d4b0 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
1d4c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1d4d0 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
1d4e0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
1d4f0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
1d500 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1d510 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1d520 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1d530 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
1d540 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
1d550 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
1d560 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  Hdr *pPg;.    as
1d570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1d580 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
1d590 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
1d5a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1d5b0 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
1d5c0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1d5d0 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
1d5e0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
1d5f0 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
1d600 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
1d610 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
1d620 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
1d630 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
1d640 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
1d650 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
1d660 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1d670 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
1d680 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
1d690 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
1d6a0 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
1d6b0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
1d6c0 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
1d6d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1d6e0 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
1d6f0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
1d700 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
1d710 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
1d720 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1d730 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1d740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d750 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1d760 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
1d770 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1d780 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75  M.      if( nTru
1d790 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
1d7a0 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
1d7b0 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
1d7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
1d7d0 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
1d7e0 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  pages.        **
1d7f0 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
1d800 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
1d810 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
1d820 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1d830 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1d840 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1d850 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
1d860 20 20 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67        void *pPag
1d870 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e;.        int i
1d880 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
1d890 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
1d8a0 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72        for( i=nTr
1d8b0 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  unc+1; i<=pPager
1d8c0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b  ->origDbSize; i+
1d8d0 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
1d8e0 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  f( !(pPager->aIn
1d8f0 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28  Journal[i/8] & (
1d900 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21  1<<(i&7))) && i!
1d910 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
1d920 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d930 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
1d940 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
1d950 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d970 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1d980 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d990 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1d9a0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
1d9b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
1d9c0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
1d9d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1d9e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d9f0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1da00 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1da10 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
1da20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
1da30 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
1da40 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
1da50 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
1da60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1da70 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1da80 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  t;.      rc = sy
1da90 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1daa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1dab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1dac0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1dad0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1dae0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1daf0 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
1db00 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
1db10 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1db20 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1db30 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20   nTrunc);.      
1db40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1db50 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1db60 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  it;.    }.#endif
1db70 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
1db80 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
1db90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1dba0 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
1dbb0 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1dbc0 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
1dbd0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  r);.    rc = pag
1dbe0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1dbf0 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  t(pPg);.    if( 
1dc00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1dc10 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1dc20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
1dc30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1dc40 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1dc50 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
1dc60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dc70 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
1dc80 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  d, 0);.    }..  
1dc90 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1dca0 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
1dcb0 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
1dcc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dcd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1dce0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
1dcf0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
1dd00 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
1dd10 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
1dd20 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
1dd30 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
1dd40 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
1dd50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
1dd60 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
1dd70 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
1dd80 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
1dd90 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1dda0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ddb0 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
1ddc0 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
1ddd0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
1dde0 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
1ddf0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
1de00 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
1de10 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
1de20 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1de30 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
1de40 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
1de50 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
1de60 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
1de70 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
1de80 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1de90 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
1dea0 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
1deb0 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
1dec0 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
1ded0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
1dee0 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
1def0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1df00 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
1df10 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
1df20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
1df30 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1df40 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
1df50 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
1df60 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
1df70 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1df80 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
1df90 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
1dfa0 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
1dfb0 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
1dfc0 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
1dfd0 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
1dfe0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
1dff0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1e000 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e  s active)..*/.in
1e010 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  t sqlite3pager_m
1e020 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
1e030 50 61 67 65 72 2c 20 76 6f 69 64 20 2a 70 44 61  Pager, void *pDa
1e040 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  ta, Pgno pgno){.
1e050 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
1e060 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
1e070 74 61 29 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta);.  PgHdr *pP
1e080 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a  gOld; .  int h;.
1e090 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
1e0a0 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  gno = 0;..  asse
1e0b0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1e0c0 29 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d 4f  );..  TRACE5("MO
1e0d0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
1e0e0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
1e0f0 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
1e100 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1e110 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1e120 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
1e130 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d  no);..  if( pPg-
1e140 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1e150 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
1e160 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
1e170 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1e180 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
1e190 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20  ert( pPg->dirty 
1e1a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1e1b0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1e1c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  );.  }..  /* Unl
1e1d0 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
1e1e0 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a  s hash-chain */.
1e1f0 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
1e200 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
1e210 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
1e220 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
1e230 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
1e240 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
1e250 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
1e260 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  's hash chain. A
1e270 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
1e280 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
1e290 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
1e2a0 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
1e2b0 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
1e2c0 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
1e2d0 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
1e2e0 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
1e2f0 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
1e300 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
1e310 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1e320 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1e330 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
1e340 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
1e350 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
1e360 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1e370 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
1e380 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79 20 3d 20  pPgOld->dirty = 
1e390 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c  0;.    if( pPgOl
1e3a0 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  d->needSync ){. 
1e3b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1e3c0 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  Old->inJournal )
1e3d0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1e3e0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1e3f0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1e400 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
1e410 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e420 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ync );.    }.  }
1e430 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68  ..  /* Change th
1e440 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1e450 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74  r pPg and insert
1e460 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   it into the new
1e470 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a   hash-chain. */.
1e480 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
1e490 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67 65 72 5f  no;.  h = pager_
1e4a0 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66  hash(pgno);.  if
1e4b0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1e4c0 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
1e4d0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1e4e0 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
1e4f0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1e500 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1e510 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
1e520 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1e530 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
1e540 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
1e550 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
1e560 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
1e570 20 30 3b 0a 0a 20 20 70 50 67 2d 3e 64 69 72 74   0;..  pPg->dirt
1e580 79 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  y = 1;.  pPager-
1e590 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1e5a0 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
1e5b0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
1e5c0 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
1e5d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1e5e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e5f0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
1e600 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
1e610 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
1e620 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
1e630 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
1e640 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
1e650 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
1e660 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
1e670 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
1e680 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
1e690 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
1e6a0 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
1e6b0 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
1e6c0 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
1e6d0 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
1e6e0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
1e6f0 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
1e700 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
1e710 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
1e720 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
1e730 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
1e740 33 70 61 67 65 72 5f 67 65 74 28 29 20 63 61 6c  3pager_get() cal
1e750 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
1e760 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
1e770 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
1e780 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
1e790 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1e7a0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
1e7b0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1e7c0 76 6f 69 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b  void *pNeedSync;
1e7d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e7e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
1e7f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e800 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1e810 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
1e820 20 26 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20   &pNeedSync);.  
1e830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e840 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1e850 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
1e860 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1e870 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1e880 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e  edSync)->needSyn
1e890 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  c = 1;.    DATA_
1e8a0 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1e8b0 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  nc)->inJournal =
1e8c0 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1e8d0 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1e8e0 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
1e8f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1e900 72 65 66 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a  ref(pNeedSync);.
1e910 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1e920 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1e930 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
1e940 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1e950 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1e960 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1e970 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
1e980 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
1e990 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
1e9a0 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
1e9b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1e9c0 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
1e9d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
1e9e0 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
1e9f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
1ea00 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
1ea10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1ea20 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50  ager_lockstate(P
1ea30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ea40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
1ea50 73 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65  sLockState(pPage
1ea60 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66  r->fd);.}.#endif
1ea70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ea80 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
1ea90 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
1eaa0 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
1eab0 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
1eac0 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
1ead0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
1eae0 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
1eaf0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
1eb00 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
1eb10 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1eb20 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1eb30 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
1eb40 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
1eb50 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
1eb60 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
1eb70 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e  GE %3d addr=%p n
1eb80 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
1eb90 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47     pPg->pgno, PG
1eba0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1ebb0 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
1ebc0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64  }.}.#endif..#end
1ebd0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1ebe0 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.