/ Hex Artifact Content
Login

Artifact da3c5e90b2c99bdba6129f568102c24cbd438452:


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 39  : pager.c,v 1.29
0350: 33 20 32 30 30 37 2f 30 33 2f 32 33 20 31 38 3a  3 2007/03/23 18:
0360: 31 32 3a 30 37 20 64 61 6e 69 65 6c 6b 31 39 37  12:07 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 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 54 52 41 43 45 31 28 58 29 20 20 20 20  ne TRACE1(X)    
0470: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0480: 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69 6e 65  rintf(X).#define
0490: 20 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20   TRACE2(X,Y)    
04a0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04b0: 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  ntf(X,Y).#define
04c0: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20   TRACE3(X,Y,Z)  
04d0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
04e0: 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69  ntf(X,Y,Z).#defi
04f0: 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  ne TRACE4(X,Y,Z,
0500: 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  W) sqlite3DebugP
0510: 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a 23  rintf(X,Y,Z,W).#
0520: 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c  define TRACE5(X,
0530: 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33  Y,Z,W,V) sqlite3
0540: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
0550: 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65  Z,W,V).#else.#de
0560: 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23  fine TRACE1(X).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  Y).#define TRACE
0590: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05a0: 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29   TRACE4(X,Y,Z,W)
05b0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35 28  .#define TRACE5(
05c0: 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69  X,Y,Z,W,V).#endi
05d0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
05e0: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
05f0: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
0600: 6e 20 74 68 65 20 54 52 41 43 45 58 28 29 20 6d  n the TRACEX() m
0610: 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74  acros above.** t
0620: 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65  o print out file
0630: 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a  -descriptors. .*
0640: 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74  *.** PAGERID() t
0650: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
0660: 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74  o a Pager struct
0670: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
0680: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0690: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
06a0: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
06b0: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
06c0: 20 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65   takes an OsFile
06d0: 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74  .** struct as it
06e0: 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  's argument..*/.
06f0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0700: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0710: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0720: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0730: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0740: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0750: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0760: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0770: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0780: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
0790: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07a0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07b0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07c0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
07f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0800: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0830: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0840: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0850: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0860: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0870: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0880: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
0890: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08a0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08b0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08d0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08e0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
08f0: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0910: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0920: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0930: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0960: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0970: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0980: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
0990: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09b0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09e0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
09f0: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a00: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a20: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a30: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a40: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a60: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a70: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a80: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0a90: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ac0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ad0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0af0: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b00: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b10: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b20: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b30: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b40: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b60: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b70: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b80: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bb0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bc0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0bd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0be0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0bf0: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c00: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c10: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c20: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c30: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c40: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c70: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c80: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0c90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cb0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cc0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0cd0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d00: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d10: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74  o is to remove t
0d20: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
0d40: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65  nal file and the
0d50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
0d60: 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  l be.**         
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
0d80: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0d90: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0da0: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0db0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0dc0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0dd0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0de0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0df0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0e00: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0e10: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0e20: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0e30: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0e40: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0e50: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0e60: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0e70: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0e80: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0e90: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0ea0: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0eb0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0ec0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0ed0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0ee0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0ef0: 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29  ite_page_write()
0f00: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0f10: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0f20: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0f30: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0f40: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0f50: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0f60: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0f70: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0f80: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0f90: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0fa0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0fb0: 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20 62  VE occurs when b
0fc0: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
0fd0: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
0fe0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0ff0: 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71  le.  After an sq
1000: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1010: 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  ck().** or sqlit
1020: 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e_pager_commit()
1030: 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f 65 73  , the state goes
1040: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
1050: 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e  HARED..*/.#defin
1060: 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20  e PAGER_UNLOCK  
1070: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41      0.#define PA
1080: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
1090: 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53  1   /* same as S
10a0: 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  HARED_LOCK */.#d
10b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45  efine PAGER_RESE
10c0: 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73  RVED    2   /* s
10d0: 61 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f  ame as RESERVED_
10e0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
10f0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1100: 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    4   /* same as
1110: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
1120: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1130: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a  _SYNCED      5..
1140: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  /*.** If the SQL
1150: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
1160: 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20  D_LOCK macro is 
1170: 73 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 63  set to true at c
1180: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20  ompile-time,.** 
1190: 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65  then failed atte
11a0: 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20 72 65  mpts to get a re
11b0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c  served lock will
11c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
11d0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68   callback..** Th
11e0: 69 73 20 69 73 20 6f 66 66 20 62 79 20 64 65 66  is is off by def
11f0: 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68  ault.  To see wh
1200: 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  y, consider the 
1210: 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
1220: 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f  io:.** .** Suppo
1230: 73 65 20 74 68 72 65 61 64 20 41 20 61 6c 72 65  se thread A alre
1240: 61 64 79 20 68 61 73 20 61 20 73 68 61 72 65 64  ady has a shared
1250: 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20   lock and wants 
1260: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1270: 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72  .** Thread B alr
1280: 65 61 64 79 20 68 61 73 20 61 20 72 65 73 65 72  eady has a reser
1290: 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  ved lock and wan
12a0: 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ts an exclusive 
12b0: 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74  lock.  If.** bot
12c0: 68 20 74 68 72 65 61 64 73 20 61 72 65 20 75 73  h threads are us
12d0: 69 6e 67 20 74 68 65 69 72 20 62 75 73 79 20 63  ing their busy c
12e0: 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67  allbacks, it mig
12f0: 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d  ht be a long tim
1300: 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20  e.** be for one 
1310: 6f 66 20 74 68 65 20 74 68 72 65 61 64 73 20 67  of the threads g
1320: 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77  ive up and allow
1330: 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70  s the other to p
1340: 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69  roceed..** But i
1350: 66 20 74 68 65 20 74 68 72 65 61 64 20 74 72 79  f the thread try
1360: 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20 72  ing to get the r
1370: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76  eserved lock giv
1380: 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a  es up quickly.**
1390: 20 28 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e   (if it never in
13a0: 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20 63  vokes its busy c
13b0: 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68  allback) then th
13c0: 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c  e contention wil
13d0: 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64  l be.** resolved
13e0: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66   quickly..*/.#if
13f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59  ndef SQLITE_BUSY
1400: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23  _RESERVED_LOCK.#
1410: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42   define SQLITE_B
1420: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1430: 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 0.#endif../*.*
1440: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75  * This macro rou
1450: 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f  nds values up so
1460: 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c   that if the val
1470: 75 65 20 69 73 20 61 6e 20 61 64 64 72 65 73 73  ue is an address
1480: 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e   it.** is guaran
1490: 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64  teed to be an ad
14a0: 64 72 65 73 73 20 74 68 61 74 20 69 73 20 61 6c  dress that is al
14b0: 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79  igned to an 8-by
14c0: 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
14d0: 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c  #define FORCE_AL
14e0: 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28  IGNMENT(X)   (((
14f0: 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a  X)+7)&~7)../*.**
1500: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1510: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1520: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1530: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1540: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1550: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1560: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1570: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1580: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1590: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
15a0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
15b0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
15c0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
15d0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
15e0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
15f0: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1600: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1610: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1620: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1630: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1640: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1650: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1660: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1670: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1680: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1690: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
16a0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
16b0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
16c0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
16d0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
16e0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
16f0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1700: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1710: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1720: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1730: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1740: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1750: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1760: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1770: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1780: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1790: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
17a0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
17b0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
17c0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
17d0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
17e0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
17f0: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1800: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1810: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1830: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1840: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1850: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1860: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1870: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1880: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1890: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
18a0: 67 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75  gHdr PgHdr;.stru
18b0: 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67  ct PgHdr {.  Pag
18c0: 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18e0: 68 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63  he pager to whic
18f0: 68 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f  h this page belo
1900: 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ngs */.  Pgno pg
1910: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
1920: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1930: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
1940: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
1950: 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20  Hdr *pNextHash, 
1960: 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20  *pPrevHash;  /* 
1970: 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  Hash collision c
1980: 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70  hain for PgHdr.p
1990: 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  gno */.  PgHdr *
19a0: 70 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65  pNextFree, *pPre
19b0: 76 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c  vFree;  /* Freel
19c0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65  ist of pages whe
19d0: 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20  re nRef==0 */.  
19e0: 50 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b  PgHdr *pNextAll;
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a00: 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  * A list of all 
1a10: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
1a20: 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50   *pNextStmt, *pP
1a30: 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73  revStmt;  /* Lis
1a40: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
1a50: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1a60: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f  nal */.  u8 inJo
1a70: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
1a80: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1a90: 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  if has been writ
1aa0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
1ab0: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
1ae0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
1af0: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  ubjournal */.  u
1b00: 38 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20  8 dirty;        
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b20: 20 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64   TRUE if we need
1b30: 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63   to write back c
1b40: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e  hanges */.  u8 n
1b50: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
1b70: 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  nc journal befor
1b80: 65 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70  e writing this p
1b90: 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  age */.  u8 alwa
1ba0: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
1bb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1bc0: 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  le dont_rollback
1bd0: 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  () for this page
1be0: 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20   */.  short int 
1bf0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1c00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c10: 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20  f users of this 
1c20: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1c30: 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44  *pDirty, *pPrevD
1c40: 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74  irty;    /* Dirt
1c50: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32  y pages */.  u32
1c60: 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20   notUsed;       
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1c80: 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23  uffer space */.#
1c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1ca0: 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70  CK_PAGES.  u32 p
1cb0: 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a  ageHash;.#endif.
1cc0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67    /* pPager->pag
1cd0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70  eSize bytes of p
1ce0: 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  age data follow 
1cf0: 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20  this header */. 
1d00: 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61   /* Pager.nExtra
1d10: 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20   bytes of local 
1d20: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20  data follow the 
1d30: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a  page data */.};.
1d40: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  ./*.** For an in
1d50: 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74  -memory only dat
1d60: 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72  abase, some extr
1d70: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
1d80: 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a   recorded about.
1d90: 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20  ** each page so 
1da0: 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e  that changes can
1db0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1dc0: 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73    (Journal files
1dd0: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64   are not.** used
1de0: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1df0: 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20  atabases.)  The 
1e00: 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d  following inform
1e10: 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ation is added t
1e20: 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  o.** the end of 
1e30: 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63  every EXTRA bloc
1e40: 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  k for in-memory 
1e50: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
1e60: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
1e70: 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  n could have bee
1e80: 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79  n added directly
1e90: 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74   to the PgHdr st
1ea0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20  ructure..** But 
1eb0: 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61  then it would ta
1ec0: 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38  ke up an extra 8
1ed0: 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67   bytes of storag
1ee0: 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72  e on every PgHdr
1ef0: 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73  .** even for dis
1f00: 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  k-based database
1f10: 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74  s.  Splitting it
1f20: 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74   out saves 8 byt
1f30: 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  es.  This.** is 
1f40: 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f  only a savings o
1f50: 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65  f 0.8% but those
1f60: 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64   percentages add
1f70: 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20   up..*/.typedef 
1f80: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
1f90: 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75   PgHistory;.stru
1fa0: 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20  ct PgHistory {. 
1fb0: 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20   u8 *pOrig;     
1fc0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65  /* Original page
1fd0: 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20   text.  Restore 
1fe0: 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c  to this on a ful
1ff0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  l rollback */.  
2000: 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  u8 *pStmt;     /
2010: 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73  * Text as it was
2020: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2030: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
2040: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b   statement */.};
2050: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
2060: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
2070: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
2080: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
2090: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
20a0: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
20b0: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
20c0: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
20d0: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
20e0: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
20f0: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2100: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2110: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2120: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2130: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2140: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
2150: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
2160: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
2170: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
2180: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
2190: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
21a0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
21b0: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
21c0: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
21d0: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
21e0: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
21f0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2200: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2210: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2220: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2230: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
2240: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
2250: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
2260: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
2270: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
2280: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
2290: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
22a0: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
22b0: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
22c0: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
22d0: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
22e0: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
22f0: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2300: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2310: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2320: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2330: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2340: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
2350: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
2360: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
2370: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
2380: 52 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52 4f  RUPT, SQLITE_PRO
2390: 54 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49  TOCOL.** or SQLI
23a0: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
23b0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
23c0: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
23d0: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
23e0: 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e  ** and is return
23f0: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
2400: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
2410: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
2420: 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   The.** SQLITE_F
2430: 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ULL return code 
2440: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
2450: 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73  erent. It persis
2460: 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68  ts only until th
2470: 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73  e.** next succes
2480: 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73  sful rollback is
2490: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
24a0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41  e pager cache. A
24b0: 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46  lso,.** SQLITE_F
24c0: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
24d0: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
24e0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
24f0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
2500: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
2510: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2520: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2530: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
2540: 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f   {.  u8 journalO
2550: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2570: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
2580: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
2590: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
25a0: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
25b0: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
25c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
25d0: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
25e0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
25f0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
2600: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2610: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
2620: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
2630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2640: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2650: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
2660: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  cks */.  u8 stmt
2670: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2680: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2690: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
26a0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
26b0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
26c0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
26d0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
26e0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
26f0: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2700: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2710: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2720: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2730: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2740: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2750: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2790: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
27a0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
27b0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
27c0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
27d0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
27e0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c  ness */.  u8 ful
27f0: 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20  l_fsync;        
2800: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46        /* Use F_F
2810: 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76  ULLFSYNC when av
2820: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20  ailable */.  u8 
2830: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
2850: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
2860: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
2870: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
2880: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2890: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
28a0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
28b0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
28c0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
28d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
28e0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
28f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2900: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2910: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2920: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2930: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2940: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2950: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2970: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2980: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2990: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
29a0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
29b0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
29c0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
29d0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
29e0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
29f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a00: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2a10: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2a20: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a40: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2a50: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2a60: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74  to jrnl */.  int
2a70: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2a90: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
2aa0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2ab0: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ad0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2ae0: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2af0: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2b10: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
2b20: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
2b30: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
2b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2b60: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
2b70: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
2b80: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2bb0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
2bc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2bd0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2bf0: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2c00: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2c10: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2c20: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c40: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2c50: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2c60: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2c70: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
2c80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2c90: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
2ca0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  e */.  int pageS
2cc0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2d20: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2d30: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ges */.  int nMa
2d40: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2d50: 20 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74       /* High wat
2d60: 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65  er mark of nPage
2d70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2da0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2db0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2dc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2de0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2df0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2e00: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2e10: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
2e20: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2e30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2e40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2e50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e60: 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20    u8 *aInStmt;  
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e90: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2ea0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
2eb0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ed0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ee0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2ef0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2f30: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2f40: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2f50: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2f60: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2f70: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c  */.  OsFile *fd,
2f80: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
2f90: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2fa0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
2fb0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
2fc0: 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b  .  OsFile *stfd;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fe0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ff0: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
3000: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
3010: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
3020: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
3030: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
3040: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
3050: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
3060: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
3070: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
3080: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3090: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
30a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
30b0: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
30c0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
30d0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
30e0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
30f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
3100: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
3110: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
3130: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3140: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3150: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
3160: 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20   *pDirty;       
3170: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3180: 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
3190: 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  s */.  i64 journ
31a0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
31b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
31c0: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
31d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
31e0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
31f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3200: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3210: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3220: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3230: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3250: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
3260: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
3270: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
3280: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
32a0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
32b0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
32c0: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
32d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
32e0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
32f0: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3300: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3310: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3320: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3330: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3340: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3360: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
3370: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
3380: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
3390: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
33a0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
33b0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
33c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
33d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
33e0: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
33f0: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3400: 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61  Destructor)(DbPa
3410: 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c  ge*,int); /* Cal
3420: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
3430: 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65  hen freeing page
3440: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  s */.  void (*xR
3450: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
3460: 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c  ,int);   /* Call
3470: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3480: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
3490: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a  es */.  void *(*
34a0: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
34b0: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
34c0: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
34d0: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
34e0: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
34f0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
3500: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
3510: 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f  t to xCodec() */
3520: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3540: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
3550: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  ger hash table *
3560: 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  /.  PgHdr **aHas
3570: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
3580: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
3590: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
35a0: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66   to PgHdr */.#if
35b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
35c0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
35d0: 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65  ENT.  Pager *pNe
35e0: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
35f0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
3600: 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68   of pagers in th
3610: 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e  is thread */.#en
3620: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
3630: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
3640: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
3650: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
3660: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
3670: 2f 0a 20 20 69 6e 74 20 64 6f 4e 6f 74 53 79 6e  /.  int doNotSyn
3680: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3690: 2f 2a 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  /* While true, d
36a0: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
36b0: 63 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 69  cache */.  u32 i
36c0: 43 68 61 6e 67 65 43 6f 75 6e 74 3b 20 20 20 20  ChangeCount;    
36d0: 20 20 20 20 20 20 20 2f 2a 20 44 62 20 63 68 61         /* Db cha
36e0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge-counter for 
36f0: 77 68 69 63 68 20 63 61 63 68 65 20 69 73 20 76  which cache is v
3700: 61 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  alid */.};../*.*
3710: 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54  * If SQLITE_TEST
3720: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
3730: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
3740: 61 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e  ariable given in
3750: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
3760: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3770: 45 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20  E_TEST.# define 
3780: 54 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b  TEST_INCR(x)  x+
3790: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
37a0: 20 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65   TEST_INCR(x).#e
37b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  ndif../*.** Jour
37c0: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
37d0: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
37e0: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
37f0: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
3800: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3810: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
3820: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
3830: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
3840: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
3850: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
3860: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
3870: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
3880: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
3890: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
38a0: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
38b0: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
38c0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69   journal is begi
38d0: 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  n.** written, se
38e0: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
38f0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
3900: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
3910: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
3920: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
3930: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
3940: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
3950: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
3960: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
3970: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
3980: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
3990: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
39a0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
39b0: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
39c0: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
39d0: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
39e0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
39f0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
3a00: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
3a10: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3a20: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
3a30: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3a40: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
3a50: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
3a60: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
3a70: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
3a80: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
3a90: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
3aa0: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
3ab0: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
3ac0: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
3ad0: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
3ae0: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
3af0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
3b00: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
3b10: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
3b20: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
3b30: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
3b40: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
3b50: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
3b60: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
3b70: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
3b80: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
3b90: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
3ba0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
3bb0: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
3bc0: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
3bd0: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
3be0: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
3bf0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
3c00: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
3c10: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
3c20: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
3c30: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
3c40: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
3c50: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
3c60: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
3c70: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
3c80: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
3c90: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
3ca0: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
3cb0: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
3cc0: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
3cd0: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
3ce0: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
3cf0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
3d00: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
3d10: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
3d20: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
3d30: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
3d40: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
3d50: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
3d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3d70: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
3d80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3d90: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
3da0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
3db0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
3dc0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
3dd0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
3de0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
3df0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
3e00: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
3e10: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
3e20: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
3e30: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
3e40: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
3e50: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
3e60: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
3e70: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
3e80: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
3e90: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
3ea0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
3eb0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
3ec0: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
3ed0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
3ee0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
3ef0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
3f00: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
3f10: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3f20: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
3f30: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
3f40: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
3f50: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3f60: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
3f70: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
3f80: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
3f90: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
3fa0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
3fb0: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
3fc0: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
3fd0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
3fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
3ff0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4000: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4010: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
4020: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
4030: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61  #endif../*.** Pa
4040: 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f  ge number PAGER_
4050: 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72  MJ_PGNO is never
4060: 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69   used in an SQLi
4070: 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20  te database (it 
4080: 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66  is.** reserved f
4090: 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e  or working aroun
40a0: 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69  d a windows/posi
40b0: 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74  x incompatibilit
40c0: 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65  y). It is.** use
40d0: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
40e0: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74   to signify that
40f0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
4100: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
4110: 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65  le .** is devote
4120: 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d  d to storing a m
4130: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
4140: 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e  me - there are n
4150: 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a  o more pages to.
4160: 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65  ** roll back. Se
4170: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66  e comments for f
4180: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73  unction writeMas
4190: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
41a0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20   details..*/./* 
41b0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
41c0: 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e  _PGNO(x) (PENDIN
41d0: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
41e0: 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69  eSize)) */.#defi
41f0: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
4200: 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59  (x) ((PENDING_BY
4210: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
4220: 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  e))+1)../*.** Th
4230: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
4240: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
4250: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
4260: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
4270: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
4280: 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65  ./*.** Enable re
4290: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72  ference count tr
42a0: 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75  acking (for debu
42b0: 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a  gging) here:.*/.
42c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
42d0: 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  ST.  int pager3_
42e0: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
42f0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
4300: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
4310: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
4320: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
4330: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
4340: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4350: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
4360: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4370: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
4380: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
4390: 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d  nRef=%-3d total=
43a0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
43b0: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
43c0: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
43d0: 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  , p->pPager->nRe
43e0: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
43f0: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
4400: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
4410: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
4420: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
4430: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
4440: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
4450: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
4460: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4470: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
4480: 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  of the pager has
4490: 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e  h table to N.  N
44a0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
44b0: 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73  .** of two..*/.s
44c0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
44d0: 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
44e0: 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
44f0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64  , int N){.  PgHd
4500: 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b  r **aHash, *pPg;
4510: 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26  .  assert( N>0 &
4520: 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29  & (N&(N-1))==0 )
4530: 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69  ;.  aHash = sqli
4540: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
4550: 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a  (aHash[0])*N );.
4560: 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29    if( aHash==0 )
4570: 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65  {.    /* Failure
4580: 20 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f   to rehash is no
4590: 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20  t an error.  It 
45a0: 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72  is only a perfor
45b0: 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20  mance hit. */.  
45c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
45d0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
45e0: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
45f0: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a  ger->nHash = N;.
4600: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
4610: 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  = aHash;.  for(p
4620: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
4630: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
4640: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e  NextAll){.    in
4650: 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67  t h;.    if( pPg
4660: 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
4670: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
4680: 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
4690: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
46a0: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  0 );.      conti
46b0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
46c0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
46d0: 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  N-1);.    pPg->p
46e0: 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68  NextHash = aHash
46f0: 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61  [h];.    if( aHa
4700: 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61  sh[h] ){.      a
4710: 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
4720: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
4730: 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70      aHash[h] = p
4740: 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72  Pg;.    pPg->pPr
4750: 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a  evHash = 0;.  }.
4760: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
4770: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
4780: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
4790: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
47a0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
47b0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
47c0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
47d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
47e0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
47f0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
4800: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4810: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4820: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
4830: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
4840: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
4850: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
4860: 74 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46  t read32bits(OsF
4870: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52  ile *fd, u32 *pR
4880: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
4890: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
48a0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
48b0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
48c0: 65 6f 66 28 61 63 29 29 3b 0a 20 20 69 66 28 20  eof(ac));.  if( 
48d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
48e0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 28 61 63  .    *pRes = (ac
48f0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4900: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4910: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d  <8) | ac[3];.  }
4920: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4930: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4940: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4950: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
4960: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
4970: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
4980: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 33  static void put3
4990: 32 62 69 74 73 28 63 68 61 72 20 2a 61 63 2c 20  2bits(char *ac, 
49a0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 61 63 5b 30  u32 val){.  ac[0
49b0: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
49c0: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
49d0: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
49e0: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
49f0: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
4a00: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
4a10: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  f;.}../*.** Writ
4a20: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
4a30: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
4a40: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4a50: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4a60: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4a70: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4a80: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4a90: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4aa0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4ab0: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4ac0: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  d, u32 val){.  c
4ad0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4ae0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4af0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4b00: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4b10: 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   4);.}../*.** Re
4b20: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
4b30: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f  ger at offset 'o
4b40: 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20  ffset' from the 
4b50: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
4b60: 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65  by.** page heade
4b70: 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  r 'p'..*/.static
4b80: 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62   u32 retrieve32b
4b90: 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e  its(PgHdr *p, in
4ba0: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
4bb0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
4bc0: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
4bd0: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
4be0: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
4bf0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63  t];.  return (ac
4c00: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4c10: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4c20: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a  <8) | ac[3];.}..
4c30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
4c40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
4c50: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72  alled when an er
4c60: 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
4c70: 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  n the pager.** c
4c80: 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  ode. The first a
4c90: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
4ca0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
4cb0: 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
4cc0: 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65  .** second the e
4cd0: 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
4ce0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
4cf0: 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
4d00: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20  nction. .** The 
4d10: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
4d20: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
4d30: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4d40: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
4d50: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
4d60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4d70: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
4d80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
4d90: 6f 72 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  or SQLITE_PROTOC
4da0: 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  OL,.** the error
4db0: 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74   becomes persist
4dc0: 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65 71 75  ent. All subsequ
4dd0: 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e  ent API calls on
4de0: 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a 20 77   this Pager.** w
4df0: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
4e00: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
4e10: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
4e20: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
4e30: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
4e40: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
4e50: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
4e60: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xff;.  assert( p
4e70: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
4e80: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 70  SQLITE_FULL || p
4e90: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
4ea0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
4eb0: 66 28 20 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c  f( .    rc2==SQL
4ec0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
4ed0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
4ee0: 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  R ||.    rc2==SQ
4ef0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 0a  LITE_CORRUPT ||.
4f00: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4f10: 50 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a 20 20  PROTOCOL.  ){.  
4f20: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
4f30: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
4f40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
4f50: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
4f60: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
4f70: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
4f80: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
4f90: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
4fa0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
4fb0: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
4fc0: 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68  *pPage){.  u32 h
4fd0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
4fe0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
4ff0: 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69  r *pData = (unsi
5000: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
5010: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
5020: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5030: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
5040: 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  geSize; i++){.  
5050: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69    hash = (hash+i
5060: 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  )^pData[i];.  }.
5070: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
5080: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
5090: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
50a0: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
50b0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
50c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
50d0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
50e0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
50f0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
5100: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
5110: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
5120: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
5130: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
5140: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
5150: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
5160: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
5170: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
5180: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
5190: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
51a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
51b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
51c0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
51d0: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
51e0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
51f0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44  >errCode || MEMD
5200: 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20  B || pPg->dirty 
5210: 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  || .      pPg->p
5220: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
5230: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
5240: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
5250: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
5260: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
5270: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
5280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5290: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
52a0: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
52b0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
52c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
52d0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
52e0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
52f0: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
5300: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
5310: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5320: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
5330: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
5340: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5350: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
5360: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
5370: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
5380: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
5390: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
53a0: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
53b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
53c0: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
53d0: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
53e0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
53f0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
5400: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
5410: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
5420: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
5430: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
5440: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
5450: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
5460: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
5470: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5480: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
5490: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
54a0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
54b0: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
54c0: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
54d0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
54e0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
54f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5500: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
5510: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5520: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
5530: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a  pJrnl, szJ-16);.
5540: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5550: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5560: 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  . .  rc = read32
5570: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e  bits(pJrnl, &len
5580: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5590: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
55a0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
55b0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63  32bits(pJrnl, &c
55c0: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
55d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
55e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
55f0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5600: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b  rnl, aMagic, 8);
5610: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5620: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
5630: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
5640: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
5650: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
5660: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
5670: 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  l, szJ-16-len);.
5680: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5690: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
56a0: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
56b0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
56c0: 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69  lloc(len+1);.  i
56d0: 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b  f( !*pzMaster ){
56e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
56f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5700: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5710: 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73  ad(pJrnl, *pzMas
5720: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
5730: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5740: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5750: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5760: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5770: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5780: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
5790: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
57a0: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
57b0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
57c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
57d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
57e0: 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29  m -= (*pzMaster)
57f0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [i];.  }.  if( c
5800: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
5810: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
5820: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
5830: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
5840: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
5850: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
5860: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
5870: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
5880: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
5890: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
58a0: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
58b0: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
58c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
58d0: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
58e0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
58f0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
5900: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  me..    */.    s
5910: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5920: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5930: 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ter = 0;.  }else
5940: 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72  {.    (*pzMaster
5950: 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  )[len] = '\0';. 
5960: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
5970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5980: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
5990: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
59a0: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
59b0: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
59c0: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
59d0: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
59e0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
59f0: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
5a00: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
5a10: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
5a20: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
5a30: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
5a40: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
5a50: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
5a60: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
5a70: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
5a80: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ac0: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
5b10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5b20: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
5b30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
5b40: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
5b50: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
5b60: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
5b70: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
5b80: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5b90: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
5ba0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
5bb0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5bc0: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
5bd0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5be0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5bf0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
5c00: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
5c10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
5c20: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
5c30: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
5c40: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5c50: 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67  Pager) );.  pPag
5c60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
5c70: 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72   offset;.  retur
5c80: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  n sqlite3OsSeek(
5c90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
5ca0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
5cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
5cc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
5cd0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
5ce0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5cf0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
5d00: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
5d10: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
5d20: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
5d30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5d40: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
5d50: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
5d60: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
5d70: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
5d80: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
5d90: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
5da0: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
5db0: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
5dc0: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
5dd0: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
5de0: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
5df0: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
5e00: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
5e10: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
5e20: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
5e30: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
5e40: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
5e50: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
5e60: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
5e70: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
5e80: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
5e90: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
5ea0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
5eb0: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
5ec0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
5ed0: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
5ee0: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
5ef0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
5f00: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5f10: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61   *pPager){.  cha
5f20: 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  r zHeader[sizeof
5f30: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
5f40: 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  16];.  int rc;..
5f50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
5f60: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
5f70: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
5f80: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
5f90: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
5fa0: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
5fb0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
5fc0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
5fd0: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
5fe0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
5ff0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6000: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
6010: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
6020: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6030: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
6040: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
6050: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
6060: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
6070: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
6080: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
6090: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
60a0: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
60b0: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
60c0: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
60d0: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
60e0: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
60f0: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
6100: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
6110: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
6120: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
6130: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
6140: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65   this..  */.  me
6150: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
6160: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6170: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6180: 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52  c));.  /* The nR
6190: 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46  ec Field. 0xFFFF
61a0: 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63  FFFF for no-sync
61b0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
61c0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
61d0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
61e0: 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
61f0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
6200: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f  ffffff : 0);.  /
6210: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
6220: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
6230: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
6240: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
6250: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
6260: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
6270: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
6280: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6290: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
62a0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
62b0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
62c0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
62d0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
62e0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
62f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6300: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
6310: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
6320: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
6330: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
6340: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
6350: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6360: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6370: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
6380: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
6390: 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  Size);.  IOTRACE
63a0: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
63b0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
63c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
63d0: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
63e0: 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  r))).  rc = sqli
63f0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6400: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
6410: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
6420: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
6430: 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20  rnal header has 
6440: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63  been written suc
6450: 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20  cessfully. Seek 
6460: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
6470: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6480: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6490: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
64a0: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20  r sector..  */. 
64b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
64c0: 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  OK ){.    IOTRAC
64d0: 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c  E(("JTAIL %p %ll
64e0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
64f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6500: 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  -1)).    rc = sq
6510: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
6520: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
6530: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
6540: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6550: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6560: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6570: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6580: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6590: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
65a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
65b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
65c0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
65d0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
65e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
65f0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6600: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
6610: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6620: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6630: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6640: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
6650: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6660: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6670: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6680: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6690: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
66a0: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
66b0: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
66c0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
66d0: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
66e0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
66f0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6700: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
6710: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
6720: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6730: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
6740: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
6750: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6760: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6770: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6780: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6790: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
67a0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
67b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
67c0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
67d0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
67e0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
67f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6800: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
6810: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6820: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6830: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6840: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6850: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6860: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6870: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6880: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6890: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
68a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
68b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
68c0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
68d0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
68e0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
68f0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6900: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
6910: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6920: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6930: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6940: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6950: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6960: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6970: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6980: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6990: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
69a0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
69b0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
69c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
69d0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
69e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
69f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6a00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6a10: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6a20: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6a30: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
6a40: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6a50: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
6a60: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6a70: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6a80: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6a90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6aa0: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6ab0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6ac0: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
6ad0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6ae0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
6af0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6b00: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
6b10: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
6b20: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6b30: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6b40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
6b50: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
6b60: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6b70: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
6b80: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
6b90: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
6ba0: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
6bb0: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
6bc0: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
6bd0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
6be0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
6bf0: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
6c00: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
6c10: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
6c20: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
6c30: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
6c40: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
6c50: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
6c60: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
6c70: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
6c80: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
6c90: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
6ca0: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
6cb0: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
6cc0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6cd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
6ce0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
6cf0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
6d00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6d10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6d20: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
6d30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6d40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
6d50: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
6d60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6d70: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
6d80: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
6d90: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
6da0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6db0: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
6dc0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
6dd0: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
6de0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6df0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
6e00: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
6e10: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
6e20: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
6e30: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
6e40: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
6e50: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
6e60: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
6e70: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
6e80: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
6e90: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
6ea0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
6eb0: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
6ec0: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
6ed0: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
6ee0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
6ef0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
6f00: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
6f10: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
6f20: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
6f30: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
6f40: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
6f50: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
6f60: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
6f70: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
6f80: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
6f90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
6fa0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
6fb0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
6fc0: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
6fd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
6fe0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
6ff0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
7000: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
7010: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
7020: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
7030: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
7040: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
7050: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
7060: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
7070: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
7080: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
7090: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
70a0: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
70b0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
70c0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
70d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
70e0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
70f0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
7100: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
7110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7120: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
7130: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
7140: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
7150: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
7160: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
7170: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
7180: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
7190: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
71a0: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
71b0: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
71c0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
71d0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
71e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
71f0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
7200: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
7210: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
7220: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
7230: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7240: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
7250: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
7260: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
7270: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
7280: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
7290: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
72a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
72b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
72c0: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
72d0: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
72e0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
72f0: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
7300: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
7310: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7320: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
7330: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7340: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7350: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
7360: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7370: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7380: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7390: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
73a0: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
73b0: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
73c0: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
73d0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
73e0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
73f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7400: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
7410: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
7420: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7430: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
7440: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
7450: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
7460: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7470: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7480: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7490: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
74a0: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
74b0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
74c0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
74d0: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
74e0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
74f0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
7500: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
7510: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
7520: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
7530: 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  s the sqlite3Pag
7540: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a  erStmtCommit().*
7550: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7560: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7570: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
7580: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
7590: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
75a0: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
75b0: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
75c0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
75d0: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
75e0: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
75f0: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7600: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7610: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7620: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
7630: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
7640: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7650: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
7660: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  Pg->pNextStmt==0
7670: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
7680: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
7690: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
76a0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
76b0: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
76c0: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
76d0: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67  pNextStmt = pPag
76e0: 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61  er->pStmt;.  pPa
76f0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7700: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
7710: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
7720: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
7730: 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  rom_stmt_list(Pg
7740: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
7750: 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20   !pPg->inStmt ) 
7760: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
7770: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a  g->pPrevStmt ){.
7780: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7790: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
77a0: 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tStmt==pPg );.  
77b0: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
77c0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
77d0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
77e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
77f0: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
7800: 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pStmt==pPg );.  
7810: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
7820: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
7830: 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tStmt;.  }.  if(
7840: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7860: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
7870: 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b  PrevStmt==pPg );
7880: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53  .    pPg->pNextS
7890: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
78a0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b   pPg->pPrevStmt;
78b0: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
78c0: 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  tStmt = 0;.  pPg
78d0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
78e0: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
78f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
7900: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
7910: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
7920: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
7930: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7940: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7950: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
7960: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
7970: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
7980: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
7990: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
79a0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
79b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
79c0: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
79d0: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
79e0: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
79f0: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
7a00: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
7a10: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
7a20: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
7a30: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
7a40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
7a50: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
7a60: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
7a70: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
7a80: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
7a90: 72 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  r){.  if( !MEMDB
7aa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7ab0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7ac0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7ad0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7ae0: 20 3d 20 2d 31 3b 0a 20 20 20 20 49 4f 54 52 41   = -1;.    IOTRA
7af0: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
7b00: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 7d 0a  ", pPager)).  }.
7b10: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7b20: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
7b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
7b50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7b60: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
7b70: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
7b80: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  se file. This is
7b90: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
7ba0: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
7bb0: 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65  y entered.** the
7bc0: 20 65 72 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f   error-state..*/
7bd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7be0: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
7bf0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
7c00: 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
7c10: 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
7c20: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rn;.  if( pPager
7c30: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
7c40: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
7c50: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
7c60: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
7c70: 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
7c80: 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
7c90: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
7ca0: 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  de || (pPager->j
7cb0: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26  ournalOpen==0 &&
7cc0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
7cd0: 6e 3d 3d 30 29 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  n==0) );.}.../*.
7ce0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
7cf0: 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72  tabase and clear
7d00: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
7d10: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
7d20: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
7d30: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
7d40: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
7d50: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
7d60: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
7d70: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
7d80: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
7d90: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
7da0: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
7db0: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
7dc0: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
7dd0: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
7de0: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
7df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7e00: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
7e10: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
7e20: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
7e30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
7e40: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
7e50: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
7e60: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
7e70: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
7e80: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
7e90: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
7ea0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50  e(pPg);.  }.  pP
7eb0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
7ec0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
7ed0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
7ee0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
7ef0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
7f00: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
7f10: 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  ->pAll = 0;.  pP
7f20: 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b  ager->nHash = 0;
7f30: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
7f40: 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
7f50: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
7f60: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  0;.  pPager->aHa
7f70: 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  sh = 0;.  pPager
7f80: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nRef = 0;.}../
7f90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
7fa0: 6f 6e 20 72 65 73 65 74 73 20 74 68 65 20 76 61  on resets the va
7fb0: 72 69 6f 75 73 20 70 61 67 65 72 20 66 6c 61 67  rious pager flag
7fc0: 73 20 74 6f 20 74 68 65 69 72 20 69 6e 69 74 69  s to their initi
7fd0: 61 6c 0a 2a 2a 20 73 74 61 74 65 20 62 75 74 20  al.** state but 
7fe0: 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 61 72 64  does not discard
7ff0: 20 74 68 65 20 63 61 63 68 65 64 20 63 6f 6e 74   the cached cont
8000: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
8010: 6f 69 64 20 70 61 67 65 72 53 6f 66 74 52 65 73  oid pagerSoftRes
8020: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
8030: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
8040: 0a 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ..  assert(pPage
8050: 72 2d 3e 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20  r->pStmt==0);.  
8060: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
8070: 52 65 66 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72  Ref==0);.  asser
8080: 74 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  t(pPager->pFirst
8090: 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
80a0: 70 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  pFirst);.  asser
80b0: 74 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  t(pPager->aInJou
80c0: 72 6e 61 6c 3d 3d 30 29 3b 0a 0a 20 20 66 6f 72  rnal==0);..  for
80d0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
80e0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
80f0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
8100: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
8110: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d  f==0 );.    pPg-
8120: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
8130: 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
8140: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  = 0;.    pPg->di
8150: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  rty = 0;.    pPg
8160: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8170: 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52      pPg->alwaysR
8180: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 7d  ollback = 0;.  }
8190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
81a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
81b0: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
81c0: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
81d0: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
81e0: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
81f0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
8200: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
8210: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
8220: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
8230: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
8240: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
8250: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
8260: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
8270: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
8280: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
8290: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
82a0: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
82b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
82c0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
82d0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
82e0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
82f0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
8300: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
8310: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
8320: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
8330: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
8340: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
8350: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
8360: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
8370: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8380: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
8390: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
83a0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
83b0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
83c0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
83d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
83e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
83f0: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
8400: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
8410: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
8420: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
8430: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
8440: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
8450: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
8460: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
8470: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
8480: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8490: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
84a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
84b0: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
84c0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
84d0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
84e0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
84f0: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
8500: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
8510: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8520: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
8530: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
8540: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
8550: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
8560: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
8570: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
8580: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
8590: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
85a0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
85b0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
85c0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
85d0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
85e0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
85f0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
8600: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
8610: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8620: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
8630: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
8640: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8650: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
8660: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
8670: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8680: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
8690: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
86a0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
86b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
86c0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
86d0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
86e0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
86f0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
8700: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8710: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
8720: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
8730: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
8740: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
8750: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
8760: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
8770: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  t;.  pPager->dbS
8780: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
8790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
87a0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
87b0: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
87c0: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
87d0: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
87e0: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
87f0: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8800: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8810: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8820: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8830: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8840: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
8850: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
8860: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
8870: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
8880: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
8890: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
88a0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
88b0: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
88c0: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
88d0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
88e0: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
88f0: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8900: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8910: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8920: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8930: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8940: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
8950: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
8960: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
8970: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
8980: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
8990: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
89a0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
89b0: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
89c0: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
89d0: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
89e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
89f0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8a00: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8a10: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8a20: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8a30: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8a40: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
8a50: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
8a60: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
8a70: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
8a80: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
8a90: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
8aa0: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
8ab0: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
8ac0: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
8ad0: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
8ae0: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
8af0: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
8b00: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
8b10: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
8b20: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
8b30: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
8b40: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
8b50: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
8b60: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
8b70: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
8b80: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
8b90: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
8ba0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
8bb0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
8bc0: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
8bd0: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
8be0: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
8bf0: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
8c00: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
8c10: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
8c20: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
8c30: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
8c40: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
8c50: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
8c60: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
8c70: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
8c80: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
8c90: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
8ca0: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
8cb0: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
8cc0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
8cd0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
8ce0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
8cf0: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
8d00: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
8d10: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
8d20: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
8d30: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
8d40: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
8d50: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
8d60: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
8d70: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
8d80: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
8d90: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8da0: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
8db0: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
8dc0: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
8dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8de0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
8df0: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
8e00: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
8e10: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
8e20: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
8e30: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
8e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8e50: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
8e60: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
8e70: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e90: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
8ea0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
8eb0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
8ec0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
8ed0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
8ee0: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
8ef0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
8f00: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
8f10: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
8f20: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
8f30: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
8f40: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
8f50: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
8f60: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
8f70: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
8f80: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
8f90: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
8fa0: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
8fb0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
8fc0: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
8fd0: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
8fe0: 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e  Cksum ? pPager->
8ff0: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
9000: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
9010: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
9020: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9030: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
9040: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9050: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
9060: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
9070: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
9080: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9090: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
90a0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
90b0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
90c0: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
90d0: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
90e0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
90f0: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
9100: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
9110: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
9120: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
9130: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
9140: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
9150: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
9160: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
9170: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
9180: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
9190: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
91a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
91b0: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
91c0: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
91d0: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
91e0: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
91f0: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
9200: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
9210: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
9220: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
9230: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
9240: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9250: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
9260: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
9270: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
9280: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9290: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
92a0: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
92b0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
92c0: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
92d0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
92e0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
92f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9300: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
9310: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
9320: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
9330: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9340: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
9350: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
9360: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
9370: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
9380: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
9390: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
93a0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
93b0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
93c0: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
93d0: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
93e0: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
93f0: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
9400: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
9410: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
9420: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9430: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
9440: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9450: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
9460: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
9470: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
9480: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
9490: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
94a0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
94b0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
94c0: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
94d0: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
94e0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
94f0: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
9500: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
9510: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
9520: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
9530: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
9540: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
9550: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
9560: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
9570: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
9580: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
9590: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
95a0: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
95b0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
95c0: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
95d0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
95e0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
95f0: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
9600: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
9610: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
9620: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
9630: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
9640: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
9650: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
9660: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
9670: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
9680: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
9690: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
96a0: 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68  ntents are in th
96b0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
96c0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
96d0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 66  therwise, if a f
96e0: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63  ull ROLLBACK occ
96f0: 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73 74  urs after the st
9700: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  atement.  ** rol
9710: 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52  lback the full R
9720: 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74  OLLBACK will not
9730: 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61 67   restore the pag
9740: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
9750: 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  l.  ** content. 
9760: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
9770: 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f  must be met befo
9780: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
9790: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
97a0: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
97b0: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
97c0: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
97d0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
97e0: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  iginal.  ** page
97f0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74   content is in t
9800: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
9810: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
9820: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
9830: 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20  n.  ** cache or 
9840: 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65  else it is marke
9850: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
9860: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
9870: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
9880: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
9890: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
98a0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
98b0: 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b  IVE || pPg!=0 );
98c0: 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59 42  .  TRACE3("PLAYB
98d0: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ACK %d page %d\n
98e0: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
98f0: 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  r), pgno);.  if(
9900: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9910: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9920: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
9930: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20  g->needSync==0) 
9940: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9950: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
9960: 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
9970: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
9980: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
9990: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
99a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
99b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
99c0: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
99d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
99e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
99f0: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
9a00: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
9a10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
9a20: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
9a30: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
9a40: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
9a50: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
9a60: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
9a70: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
9a80: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
9a90: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
9aa0: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
9ab0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
9ac0: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
9ad0: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
9ae0: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
9af0: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
9b00: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
9b10: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
9b20: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
9b30: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
9b40: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
9b50: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
9b60: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
9b70: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
9b80: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
9b90: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
9ba0: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
9bb0: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
9bc0: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
9bd0: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
9be0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9bf0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
9c00: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
9c10: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
9c20: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
9c30: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
9c40: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
9c50: 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50  structor(pPg, pP
9c60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9c70: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
9c80: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
9c90: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
9ca0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
9cb0: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
9cc0: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
9cd0: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
9ce0: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
9cf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9d00: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
9d10: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
9d20: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
9d30: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
9d40: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
9d50: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
9d60: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
9d70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
9d80: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
9d90: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
9da0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9db0: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
9dc0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
9dd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9de0: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
9df0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
9e00: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9e10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
9e20: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
9e30: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
9e40: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
9e50: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
9e60: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
9e70: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
9e80: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
9e90: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
9ea0: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
9eb0: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
9ec0: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
9ed0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
9ee0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
9ef0: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
9f00: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
9f10: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
9f20: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
9f30: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
9f40: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
9f50: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
9f60: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
9f70: 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b  ile *master = 0;
9f80: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
9f90: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
9fa0: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
9fb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9fc0: 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
9fd0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
9fe0: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
9ff0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
a000: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
a010: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a020: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
a030: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
a040: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
a050: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
a060: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
a070: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
a080: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
a090: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nce..  */.  rc =
a0a0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
a0b0: 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20  adOnly(zMaster, 
a0c0: 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20  &master);.  if( 
a0d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a0e0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a0f0: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
a100: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
a110: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
a120: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
a130: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
a140: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a150: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a160: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
a170: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
a180: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
a190: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
a1a0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
a1b0: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
a1c0: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
a1d0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
a1e0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
a1f0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
a200: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
a210: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
a220: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
a230: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
a240: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
a250: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
a260: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a270: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
a280: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
a290: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
a2a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
a2b0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
a2c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a2d0: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
a2e0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
a2f0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
a300: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
a310: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a320: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
a330: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
a340: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
a350: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
a360: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
a370: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
a380: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
a390: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
a3a0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
a3b0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a3c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
a3d0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
a3e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
a3f0: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
a400: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
a410: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
a420: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
a430: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
a440: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
a450: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
a460: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
a470: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
a480: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
a490: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
a4a0: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
a4b0: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
a4c0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
a4d0: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
a4e0: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
a4f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a500: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
a510: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a520: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a530: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
a540: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
a550: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
a560: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
a570: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
a580: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
a590: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a5a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
a5b0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a5c0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
a5d0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
a5e0: 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63  erPtr!=0 && strc
a5f0: 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
a600: 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
a610: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
a620: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
a630: 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
a640: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
a650: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
a660: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
a670: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a680: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
a690: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a6a0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
a6b0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
a6c0: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
a6d0: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
a6e0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69   }.  }.  .  sqli
a6f0: 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73  te3OsDelete(zMas
a700: 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  ter);..delmaster
a710: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
a720: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
a730: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
a740: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
a750: 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72  }  .  if( master
a760: 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  _open ){.    sql
a770: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
a780: 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
a790: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a7a0: 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65 20  Make every page 
a7b0: 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67 72  in the cache agr
a7c0: 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73 20  ee with what is 
a7d0: 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68  on disk.  In oth
a7e0: 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72  er words,.** rer
a7f0: 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20  ead the disk to 
a800: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65 20  reset the state 
a810: 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  of the cache..**
a820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a830: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
a840: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77   a rollback in w
a850: 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65  hich some of the
a860: 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20   dirty cache.** 
a870: 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72 20  pages had never 
a880: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74  been written out
a890: 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65   to disk.  We ne
a8a0: 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
a8b0: 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e  the.** cache con
a8c0: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73  tent and the eas
a8d0: 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74  iest way to do t
a8e0: 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61 64  hat is to reread
a8f0: 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74   the old content
a900: 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  .** back from th
a910: 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e disk..*/.stati
a920: 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f  c int pager_relo
a930: 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  ad_cache(Pager *
a940: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
a950: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
a960: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
a970: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
a980: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
a990: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
a9a0: 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 70    char *zBuf = p
a9b0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
a9c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ;        /* Temp
a9d0: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 6f 6e 65   storage for one
a9e0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28   page */.    if(
a9f0: 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63   !pPg->dirty ) c
aa00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
aa10: 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
aa20: 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
aa30: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  bSize ){.      r
aa40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
aa50: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  k(pPager->fd, pP
aa60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
aa70: 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
aa80: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
aa90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
aaa0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
aab0: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
aac0: 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
aad0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
aae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
aaf0: 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20  CE3("REFETCH %d 
ab00: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
ab10: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
ab20: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
ab30: 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
ab40: 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
ab50: 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70  er, zBuf, pPg->p
ab60: 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c  gno, 2);.    }el
ab70: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
ab80: 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72  (zBuf, 0, pPager
ab90: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
aba0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
abb0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
abc0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
abd0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
abe0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
abf0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47  .      memcpy(PG
ac00: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
ac10: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
ac20: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
ac30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
ac40: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
ac50: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
ac60: 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  ter(pPg, pPager-
ac70: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
ac80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ac90: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
aca0: 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
acb0: 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
acc0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
acd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
ace0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
acf0: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
ad00: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ad10: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
ad20: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
ad30: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
ad40: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
ad50: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
ad60: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
ad70: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
ad80: 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69  cate the main fi
ad90: 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  le of the given 
ada0: 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d  pager to the num
adb0: 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
adc0: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74  indicated..*/.st
add0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
ade0: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
adf0: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
ae00: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
ae10: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
ae20: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  R_EXCLUSIVE );. 
ae30: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
ae40: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
ae50: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
ae60: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
ae70: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  e);.}../*.** Pla
ae80: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
ae90: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
aea0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
aeb0: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
aec0: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
aed0: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
aee0: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
aef0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
af00: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
af10: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
af20: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
af30: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
af40: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
af50: 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
af60: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
af70: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
af80: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
af90: 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
afa0: 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
afb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
afc0: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
afd0: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
afe0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
aff0: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
b000: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
b010: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
b020: 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
b030: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
b040: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
b050: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
b060: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
b070: 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
b080: 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
b090: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
b0a0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b0b0: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
b0c0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
b0d0: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
b0e0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
b0f0: 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
b100: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
b110: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b120: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
b130: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
b140: 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
b150: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
b160: 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
b170: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
b180: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
b190: 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20  urnal.).**  (6) 
b1a0: 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
b1b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
b1c0: 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
b1d0: 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
b1e0: 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
b1f0: 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
b200: 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
b210: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
b220: 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
b230: 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
b240: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
b250: 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
b260: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
b270: 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
b280: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
b290: 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
b2a0: 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29  n UTF-8..**  (7)
b2b0: 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
b2c0: 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
b2d0: 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
b2e0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
b2f0: 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
b300: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
b310: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
b320: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
b330: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
b340: 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
b350: 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
b360: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
b370: 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
b380: 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73  he first 6 items
b390: 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
b3a0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
b3b0: 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
b3c0: 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69  nce of the 7th i
b3d0: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
b3e0: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
b3f0: 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
b400: 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
b410: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
b420: 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
b430: 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
b440: 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
b450: 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
b460: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
b470: 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
b480: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
b490: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
b4a0: 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
b4b0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
b4c0: 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
b4d0: 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
b4e0: 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
b4f0: 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
b500: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
b510: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b520: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
b530: 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
b540: 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
b550: 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
b560: 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
b570: 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
b580: 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
b590: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
b5a0: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
b5b0: 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
b5c0: 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
b5d0: 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
b5e0: 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
b5f0: 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
b600: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
b610: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
b620: 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
b630: 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
b640: 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
b650: 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
b660: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
b670: 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
b680: 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
b690: 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
b6a0: 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
b6b0: 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
b6c0: 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
b6d0: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
b6e0: 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
b6f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
b700: 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
b710: 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
b720: 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
b730: 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
b740: 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
b750: 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
b760: 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
b770: 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
b780: 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
b790: 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
b7a0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
b7b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
b7c0: 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
b7d0: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
b7e0: 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
b7f0: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
b800: 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
b810: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
b820: 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
b830: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b840: 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
b850: 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
b860: 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
b870: 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
b880: 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
b890: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
b8a0: 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
b8b0: 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
b8c0: 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
b8d0: 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
b8e0: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
b8f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
b900: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
b910: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
b920: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
b930: 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
b940: 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b960: 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
b970: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
b980: 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
b9b0: 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
b9c0: 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  nal */.  int i; 
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
b9f0: 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
ba00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ba10: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
ba20: 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
ba30: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
ba40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ba50: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
ba60: 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
ba70: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  ne */.  char *zM
ba80: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
ba90: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
baa0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
bab0: 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20  if any */..  /* 
bac0: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
bad0: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
bae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
baf0: 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
bb00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
bb10: 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
bb20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bb30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
bb40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
bb50: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
bb60: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
bb70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bb80: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
bb90: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
bba0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
bbb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
bbc0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
bbd0: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
bbe0: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
bbf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
bc00: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
bc10: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
bc20: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
bc30: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
bc40: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
bc50: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
bc60: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
bc70: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
bc80: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  d back..  */.  r
bc90: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
bca0: 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
bcb0: 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20  d, &zMaster);.  
bcc0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
bcd0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
bce0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
bcf0: 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73  | (zMaster && !s
bd00: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
bd10: 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a  ts(zMaster)) ){.
bd20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
bd30: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
bd40: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
bd50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
bd60: 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
bd70: 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OK;.    goto end
bd80: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
bd90: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
bda0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
bdb0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bdc0: 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lOff = 0;..  /* 
bdd0: 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
bde0: 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
bdf0: 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c   the readJournal
be00: 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72  Hdr() call retur
be10: 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  ns.  ** SQLITE_D
be20: 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
be30: 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
be40: 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20  while( 1 ){..   
be50: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
be60: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
be70: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
be80: 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
be90: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
bea0: 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
beb0: 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
bec0: 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
bed0: 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
bee0: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
bef0: 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
bf00: 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
bf10: 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
bf20: 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
bf30: 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
bf40: 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
bf50: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
bf60: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
bf70: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
bf80: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
bf90: 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
bfa0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bfb0: 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
bfc0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
bfd0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
bfe0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
c000: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
c010: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c020: 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
c030: 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
c040: 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
c050: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
c060: 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
c070: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
c080: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
c090: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
c0a0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
c0b0: 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
c0c0: 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
c0d0: 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
c0e0: 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
c0f0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
c100: 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
c110: 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
c120: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
c130: 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
c140: 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
c150: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
c160: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c170: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c180: 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
c190: 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f   (szJ - JOURNAL_
c1a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
c1b0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
c1c0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
c1d0: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
c1e0: 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
c1f0: 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
c200: 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
c210: 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
c220: 72 6f 63 65 73 73 2e 20 49 6e 20 74 68 69 73 20  rocess. In this 
c230: 63 61 73 65 20 74 68 65 20 72 65 73 74 20 6f 66  case the rest of
c240: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c250: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 20 20  e consists of.  
c260: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20    ** journalled 
c270: 63 6f 70 69 65 73 20 6f 66 20 70 61 67 65 73 20  copies of pages 
c280: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
c290: 72 65 61 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  read back into t
c2a0: 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  he cache..    */
c2b0: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
c2c0: 20 26 26 20 21 69 73 48 6f 74 20 29 7b 0a 20 20   && !isHot ){.  
c2d0: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
c2e0: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
c2f0: 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
c300: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
c310: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
c320: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
c330: 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
c340: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
c350: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
c360: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
c370: 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f  e back to it's o
c380: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
c390: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
c3a0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
c3b0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a  R_EXCLUSIVE && .
c3c0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c3d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
c3e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c3f0: 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
c400: 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
c410: 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61  DbSize==0 || pPa
c420: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
c430: 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72  =mxPg );.      r
c440: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
c450: 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
c460: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c470: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c480: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
c490: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
c4a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
c4b0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
c4c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
c4d0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
c4e0: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
c4f0: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
c500: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c510: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
c520: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
c530: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
c540: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
c550: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
c560: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
c570: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
c580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c590: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c5a0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
c5b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c5c0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
c5d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c5e0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
c5f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c610: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
c620: 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
c630: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c640: 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
c650: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
c660: 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
c670: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c680: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
c690: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
c6a0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
c6b0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b    if( zMaster ){
c6c0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
c6d0: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
c6e0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
c6f0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
c700: 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20  rn true,.    ** 
c710: 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
c720: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
c730: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c740: 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  al..    */.    i
c750: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c760: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
c770: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a  ager_delmaster(z
c780: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Master);.    }. 
c790: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
c7a0: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
c7b0: 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
c7c0: 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
c7d0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
c7e0: 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
c7f0: 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
c800: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
c810: 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
c820: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 50 41  h a different PA
c830: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  GER_SECTOR_SIZE.
c840: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
c850: 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
c860: 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
c870: 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
c880: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  .  pPager->secto
c890: 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
c8a0: 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
c8b0: 65 72 2d 3e 66 64 29 3b 0a 20 20 72 65 74 75 72  er->fd);.  retur
c8c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
c8d0: 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
c8e0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
c8f0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
c900: 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
c910: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
c920: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
c930: 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
c940: 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
c950: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
c960: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
c970: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
c980: 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
c990: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
c9a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
c9b0: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
c9c0: 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
c9d0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
c9e0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
c9f0: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
ca00: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
ca10: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
ca20: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
ca30: 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
ca40: 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
ca50: 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
ca60: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
ca70: 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
ca80: 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
ca90: 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
caa0: 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
cab0: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
cac0: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
cad0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
cae0: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
caf0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
cb00: 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
cb10: 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
cb20: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb40: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
cb50: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb70: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
cb80: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
cb90: 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
cba0: 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
cbb0: 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
cbc0: 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20    i64 os_szJ;.  
cbd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cbe0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
cbf0: 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
cc00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cc10: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
cc20: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
cc30: 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
cc40: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
cc50: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
cc60: 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20  the offset just 
cc70: 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
cc80: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
cc90: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74  l.  ** page writ
cca0: 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66  ten before the f
ccb0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
ccc0: 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  der for this sta
ccd0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
cce0: 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74  saction was writ
ccf0: 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ten, or the end 
cd00: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
cd10: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
cd20: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
cd30: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
cd40: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
cd50: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
cd60: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
cd70: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
cd80: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
cd90: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
cda0: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
cdb0: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
cdc0: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
cdd0: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
cde0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
cdf0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
ce00: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
ce10: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
ce20: 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
ce30: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
ce40: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
ce50: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
ce60: 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 70  ER_SHARED );.  p
ce70: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
ce80: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
ce90: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
cea0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
ceb0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
cec0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
ced0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
cee0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
cef0: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
cf00: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
cf10: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
cf20: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
cf30: 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e   nRec = pPager->
cf40: 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f  stmtNRec;.  .  /
cf50: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
cf60: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
cf70: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
cf80: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
cf90: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
cfa0: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74  se file.  Note t
cfb0: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
cfc0: 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20  t journal omits 
cfd0: 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20  checksums from. 
cfe0: 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20   ** each record 
cff0: 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c  since power-fail
d000: 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20  ure recovery is 
d010: 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  not important to
d020: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
d030: 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
d040: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
d050: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
d060: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
d070: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
d080: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
d090: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
d0a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
d0b0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
d0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
d0d0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d0e0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
d0f0: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
d100: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
d110: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
d120: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
d130: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
d140: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
d150: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
d160: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
d170: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
d180: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
d190: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
d1a0: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
d1b0: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
d1c0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d1d0: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
d1e0: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
d1f0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
d200: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
d210: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
d220: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
d230: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
d240: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
d250: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
d260: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
d270: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
d280: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
d290: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
d2a0: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
d2b0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
d2c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d2d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
d2e0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
d2f0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
d300: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d310: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
d320: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
d330: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
d340: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77  ->stmtCksum;.  w
d350: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
d360: 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66  urnalOff < hdrOf
d370: 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  f ){.    rc = pa
d380: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
d390: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
d3a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
d3b0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d3c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d3d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d3e0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
d3f0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
d400: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  }..  while( pPag
d410: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
d420: 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20   szJ ){.    u32 
d430: 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  nJRec;         /
d440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
d450: 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
d460: 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
d470: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
d480: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
d490: 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
d4a0: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
d4b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4c0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d4d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d4e0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
d4f0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
d500: 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  }.    if( nJRec=
d510: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65  =0 ){.      nJRe
d520: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
d530: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
d540: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
d550: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
d560: 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20   for(i=nJRec-1; 
d570: 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
d580: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
d590: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
d5a0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d5b0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d5c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
d5d0: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
d5e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
d5f0: 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
d600: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
d610: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
d620: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
d630: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
d640: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
d650: 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
d660: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
d670: 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70  LITE_OK) {.    p
d680: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d690: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
d6a0: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
d6b0: 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
d6c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d6d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
d6e0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
d6f0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
d700: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
d710: 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
d720: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
d730: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
d740: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
d750: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
d760: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
d770: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
d780: 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
d790: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
d7a0: 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
d7b0: 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
d7c0: 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
d7d0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
d7e0: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
d7f0: 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
d800: 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
d810: 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
d820: 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
d830: 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
d840: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
d850: 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
d860: 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
d870: 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
d880: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
d890: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
d8a0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
d8b0: 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
d8c0: 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
d8d0: 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
d8e0: 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
d8f0: 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
d900: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
d910: 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
d920: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
d930: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d940: 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
d950: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
d960: 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
d970: 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
d980: 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
d990: 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
d9a0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
d9b0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
d9c0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
d9d0: 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
d9e0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
d9f0: 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
da00: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
da10: 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
da20: 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
da30: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
da40: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
da50: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
da60: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
da70: 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
da80: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
da90: 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
daa0: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
dab0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
dac0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
dad0: 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
dae0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
daf0: 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
db00: 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
db10: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
db20: 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
db30: 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
db40: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
db50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
db60: 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
db70: 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
db80: 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
db90: 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
dba0: 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
dbb0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
dbc0: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
dbd0: 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
dbe0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
dbf0: 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
dc00: 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
dc10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
dc20: 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
dc30: 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
dc40: 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
dc50: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
dc60: 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
dc70: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
dc80: 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
dc90: 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
dca0: 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
dcb0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
dcc0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
dcd0: 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
dce0: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
dcf0: 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
dd00: 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
dd10: 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
dd20: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
dd30: 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
dd40: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
dd50: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
dd60: 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
dd70: 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
dd80: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
dd90: 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66  ->full_fsync = f
dda0: 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28  ull_fsync;.  if(
ddb0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
ddc0: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
ddd0: 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
dde0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
ddf0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
de00: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
de10: 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
de20: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
de30: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
de40: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
de50: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
de60: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
de70: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
de80: 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
de90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
dea0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
deb0: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
dec0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
ded0: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
dee0: 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
def0: 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
df00: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
df10: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
df20: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
df30: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
df40: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
df50: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
df60: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
df70: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
df80: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
df90: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
dfa0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
dfb0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
dfc0: 67 65 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69  gerOpentemp(OsFi
dfd0: 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74  le **pFd){.  int
dfe0: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
dff0: 72 63 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65  rc;.  char zFile
e000: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
e010: 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20  _SIZE];..#ifdef 
e020: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
e030: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
e040: 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
e050: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
e060: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
e070: 2f 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20  /.#endif.  do{. 
e080: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
e090: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
e0a0: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
e0b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e0c0: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
e0d0: 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77  e, pFd, 1);.  }w
e0e0: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
e0f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
e100: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
e110: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
e120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
e130: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
e140: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
e150: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
e160: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
e170: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
e180: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
e190: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
e1a0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
e1b0: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
e1c0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
e1d0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
e1e0: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
e1f0: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
e200: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
e210: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
e220: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
e230: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
e240: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
e250: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
e260: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
e270: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
e280: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
e290: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
e2a0: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
e2b0: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
e2c0: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
e2d0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
e2e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
e2f0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
e300: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
e310: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
e320: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
e330: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
e340: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
e350: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
e360: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
e370: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e380: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
e390: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
e3a0: 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
e3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e3c0: 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
e3d0: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
e3e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
e3f0: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
e400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
e410: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
e420: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e440: 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
e450: 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
e460: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
e470: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
e480: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
e490: 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
e4a0: 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50  s file */.){.  P
e4b0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
e4c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
e4d0: 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
e4e0: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20  nt nameLen;  /* 
e4f0: 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e  Compiler is wron
e500: 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  g. This is alway
e510: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65  s initialized be
e520: 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73  fore use */.  Os
e530: 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20  File *fd;.  int 
e540: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e550: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
e560: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
e570: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
e580: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
e590: 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
e5a0: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
e5b0: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
e5c0: 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
e5d0: 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
e5e0: 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
e5f0: 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20  OCK)!=0;.  char 
e600: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
e610: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66  PNAME_SIZE];.#if
e620: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e630: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
e640: 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  ENT.  /* A mallo
e650: 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  c() cannot fail 
e660: 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  in sqlite3Thread
e670: 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72  Data() as one or
e680: 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a   more calls to .
e690: 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75    ** malloc() mu
e6a0: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
e6b0: 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69  been made by thi
e6c0: 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20  s thread before 
e6d0: 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20  it gets.  ** to 
e6e0: 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73  this point. This
e6f0: 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61   means the Threa
e700: 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20  dData must have 
e710: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
e720: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74  lready.  ** so t
e730: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
e740: 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74  Alloc can be set
e750: 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69  . It would be ni
e760: 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a  ce to assert.  *
e770: 2a 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  * that ThreadDat
e780: 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d  a.nAlloc is non-
e790: 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74  zero, but alas t
e7a0: 68 69 73 20 62 72 65 61 6b 73 20 74 65 73 74 20  his breaks test 
e7b0: 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74  cases .  ** writ
e7c0: 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ten to invoke th
e7d0: 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6c 79  e pager directly
e7e0: 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44  ..  */.  ThreadD
e7f0: 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
e800: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
e810: 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20  .  assert( pTsd 
e820: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
e830: 49 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20  If malloc() has 
e840: 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 72  already failed r
e850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e860: 45 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e 0a  EM. Before even.
e870: 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f 72    ** testing for
e880: 20 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50 61   this, set *ppPa
e890: 67 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74  ger to NULL so t
e8a0: 68 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20  he caller knows 
e8b0: 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 73  the pager.  ** s
e8c0: 74 72 75 63 74 75 72 65 20 77 61 73 20 6e 65 76  tructure was nev
e8d0: 65 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20  er allocated. . 
e8e0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
e8f0: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
e900: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
e910: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e920: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e930: 20 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c    memset(&fd, 0,
e940: 20 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20   sizeof(fd));.. 
e950: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
e960: 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20  er file and set 
e970: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f  zFullPathname to
e980: 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63   point at malloc
e990: 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72  ()ed .  ** memor
e9a0: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
e9b0: 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61   complete filena
e9c0: 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69  me (i.e. includi
e9d0: 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
e9e0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  )..  */.  if( zF
e9f0: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
ea00: 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
ea10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
ea20: 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
ea30: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
ea40: 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
ea50: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
ea60: 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50   1;.      zFullP
ea70: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
ea80: 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20  StrDup("");.    
ea90: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
eaa0: 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61   {.      zFullPa
eab0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
eac0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
ead0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
eae0: 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61   if( zFullPathna
eaf0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  me ){.        rc
eb00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
eb10: 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50  ReadWrite(zFullP
eb20: 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72  athname, &fd, &r
eb30: 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  eadOnly);.      
eb40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
eb50: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
eb60: 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26  3PagerOpentemp(&
eb70: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
eb80: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
eb90: 54 65 6d 70 29 3b 0a 20 20 20 20 7a 46 69 6c 65  Temp);.    zFile
eba0: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
ebb0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
ebc0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
ebd0: 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  athname(zFilenam
ebe0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
ebf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ec00: 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
ec10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ec20: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   Allocate the Pa
ec30: 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 20 41  ger structure. A
ec40: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 61  s part of the sa
ec50: 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61  me allocation, a
ec60: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61  llocate.  ** spa
ec70: 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c 6c 20  ce for the full 
ec80: 70 61 74 68 73 20 6f 66 20 74 68 65 20 66 69 6c  paths of the fil
ec90: 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  e, directory and
eca0: 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28   journal .  ** (
ecb0: 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c  Pager.zFilename,
ecc0: 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72   Pager.zDirector
ecd0: 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  y and Pager.zJou
ece0: 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  rnal)..  */.  if
ecf0: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
ed00: 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d  ){.    nameLen =
ed10: 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74   strlen(zFullPat
ed20: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 67  hname);.    pPag
ed30: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
ed40: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
ed50: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b  r) + nameLen*3 +
ed60: 20 33 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70   30 );.    if( p
ed70: 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Pager && rc==SQL
ed80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ed90: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
eda0: 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  e = (char *)sqli
edb0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49  teMallocRaw(SQLI
edc0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
edd0: 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  SIZE);.    }.  }
ede0: 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ...  /* If an er
edf0: 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65  ror occured in e
ee00: 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
ee10: 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20  cks above, free 
ee20: 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a  the memory .  **
ee30: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
ee40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72  FullPathname, fr
ee50: 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  ee the Pager str
ee60: 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
ee70: 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e   the .  ** file.
ee80: 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72   Since the pager
ee90: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   is not allocate
eea0: 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  d there is no ne
eeb0: 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20  ed to set .  ** 
eec0: 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73  any Pager.errMas
eed0: 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  k variables..  *
eee0: 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  /.  if( !pPager 
eef0: 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  || !zFullPathnam
ef00: 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54  e || !pPager->pT
ef10: 6d 70 53 70 61 63 65 20 7c 7c 20 72 63 21 3d 53  mpSpace || rc!=S
ef20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ef30: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
ef40: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
ef50: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
ef60: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
ef70: 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
ef80: 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c  return ((rc==SQL
ef90: 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e  ITE_OK)?SQLITE_N
efa0: 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20  OMEM:rc);.  }.. 
efb0: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64   TRACE3("OPEN %d
efc0: 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
efd0: 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
efe0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52  athname);.  IOTR
eff0: 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
f000: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75  \n", pPager, zFu
f010: 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70  llPathname)).  p
f020: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f030: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
f040: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
f050: 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
f060: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
f070: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
f080: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
f090: 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
f0a0: 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
f0b0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
f0c0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
f0d0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
f0e0: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  trcpy(pPager->zD
f0f0: 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50  irectory, zFullP
f100: 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72  athname);..  for
f110: 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20  (i=nameLen; i>0 
f120: 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
f130: 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
f140: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
f150: 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
f160: 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
f170: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
f180: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c  ->zJournal, zFul
f190: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71  lPathname);.  sq
f1a0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f1b0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
f1c0: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
f1d0: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
f1e0: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
f1f0: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
f200: 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
f210: 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
f220: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
f230: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
f240: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
f250: 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
f260: 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
f270: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f280: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
f290: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f2a0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
f2b0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f2c0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
f2d0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
f2e0: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
f2f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f300: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
f310: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
f320: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
f330: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f340: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
f350: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f360: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
f370: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f380: 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20  ->nMaxPage = 0; 
f390: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
f3a0: 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73  age = 100;.  ass
f3b0: 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ert( PAGER_UNLOC
f3c0: 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61  K==0 );.  /* pPa
f3d0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
f3e0: 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
f3f0: 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
f400: 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
f410: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
f420: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
f430: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
f440: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
f450: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
f460: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
f470: 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
f480: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
f490: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
f4a0: 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
f4b0: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  al;.  pPager->fu
f4c0: 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  llSync = (pPager
f4d0: 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20  ->noSync?0:1);. 
f4e0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
f4f0: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
f500: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
f510: 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
f520: 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
f530: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f540: 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
f550: 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
f560: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64 7c  a);.  assert(fd|
f570: 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20 21  |memDb);.  if( !
f580: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
f590: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
f5a0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
f5b0: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 7d 0a 20  rSize(fd);.  }. 
f5c0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
f5d0: 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
f5e0: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
f5f0: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
f600: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
f610: 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
f620: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
f630: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f640: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
f650: 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e  EMENT.  pPager->
f660: 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50  pNext = pTsd->pP
f670: 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50  ager;.  pTsd->pP
f680: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
f690: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
f6a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f6b0: 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
f6c0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
f6d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f6e0: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
f6f0: 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
f700: 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
f710: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
f720: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
f730: 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
f740: 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
f750: 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
f760: 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
f770: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
f780: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
f790: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
f7a0: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
f7b0: 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
f7c0: 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
f7d0: 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
f7e0: 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
f7f0: 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
f800: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
f810: 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
f820: 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
f830: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
f840: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
f850: 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
f860: 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  lt sqlite3PagerC
f870: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
f880: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
f890: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
f8a0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
f8b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f8c0: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
f8d0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
f8e0: 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
f8f0: 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
f900: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
f910: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
f920: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
f930: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
f940: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
f950: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
f960: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
f970: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
f980: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
f990: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
f9a0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
f9b0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
f9c0: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
f9d0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
f9e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
f9f0: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
fa00: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
fa10: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
fa20: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
fa30: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
fa40: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
fa50: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
fa60: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
fa70: 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
fa80: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
fa90: 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
faa0: 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
fab0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
fac0: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
fad0: 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
fae0: 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ize.  Return the
faf0: 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74   new size.  If t
fb00: 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
fb10: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69  age.** size is i
fb20: 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
fb30: 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
fb40: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
fb50: 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72  elected.** and r
fb60: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
fb70: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
fb80: 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
fb90: 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53  Pager, int pageS
fba0: 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
fbb0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
fbc0: 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
fbd0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
fbe0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
fbf0: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ->memDb ){.    p
fc00: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
fc10: 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
fc20: 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72  sqlite3ReallocOr
fc30: 46 72 65 65 28 28 76 6f 69 64 20 2a 2a 29 26 70  Free((void **)&p
fc40: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
fc50: 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  , pageSize);.  }
fc60: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
fc70: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
fc80: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
fc90: 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
fca0: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
fcb0: 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
fcc0: 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
fcd0: 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
fce0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
fcf0: 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
fd00: 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
fd10: 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
fd20: 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
fd30: 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
fd40: 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
fd50: 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
fd60: 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
fd70: 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
fd80: 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
fd90: 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
fda0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
fdb0: 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
fdc0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
fdd0: 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
fde0: 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
fdf0: 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
fe00: 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
fe10: 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61  oid clear_simula
fe20: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a  ted_io_error(){.
fe30: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
fe40: 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f  or_hit = 0;.}.vo
fe50: 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
fe60: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
fe70: 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
fe80: 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
fe90: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
fea0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
feb0: 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
fec0: 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
fed0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
fee0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
fef0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
ff00: 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
ff10: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
ff20: 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64   clear_simulated
ff30: 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20 64 65  _io_error().# de
ff40: 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
ff50: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
ff60: 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
ff70: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
ff80: 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
ff90: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
ffa0: 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
ffb0: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
ffc0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
ffd0: 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
ffe0: 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
fff0: 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f  . .**.** No erro
10000 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  r checking is do
10010 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ne. The rational
10020 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
10030 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
10040 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  .** may be calle
10050 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  d even if the fi
10060 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
10070 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68  t or contain a h
10080 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68  eader. In .** th
10090 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65  ese cases sqlite
100a0 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72  3OsRead() will r
100b0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20  eturn an error, 
100c0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72  to which the cor
100d0 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73  rect .** respons
100e0 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65  e is to zero the
100f0 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74   memory at pDest
10100 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20   and continue.  
10110 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20  A real IO error 
10120 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61  .** will presuma
10130 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65  bly recur and be
10140 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72   picked up later
10150 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62   (Todo: Think ab
10160 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e  out this)..*/.in
10170 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
10180 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
10190 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
101a0 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
101b0 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
101c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
101d0 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
101e0 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d  0, N);.  if( MEM
101f0 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73  DB==0 ){.    dis
10200 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10210 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
10220 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
10230 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20  ager->fd, 0);.  
10240 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
10250 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
10260 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
10270 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
10280 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
10290 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
102a0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
102b0 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66  Dest, N);.    if
102c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
102d0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
102e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
102f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
10300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10310 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
10320 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
10330 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
10340 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
10350 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
10360 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  er. .**.** If th
10370 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c  e PENDING_BYTE l
10380 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
10390 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74  directly after t
103a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
103b0 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73   file, then cons
103c0 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70  ider this page p
103d0 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
103e0 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  too. For example
103f0 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  , if.** PENDING_
10400 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39  BYTE is byte 409
10410 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  6 (the first byt
10420 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64  e of page 5) and
10430 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
10440 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36  .** file is 4096
10450 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74   bytes, 5 is ret
10460 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66  urned instead of
10470 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   4..*/.int sqlit
10480 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
10490 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
104a0 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20  .  i64 n;.  int 
104b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
104c0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
104d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
104e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
104f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
10500 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
10510 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d  .    n = pPager-
10520 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73  >dbSize;.  } els
10530 65 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20  e {.    if( (rc 
10540 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
10550 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
10560 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  &n))!=SQLITE_OK 
10570 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
10580 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
10590 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
105a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
105b0 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
105c0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
105d0 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65     n = 1;.    }e
105e0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20  lse{.      n /= 
105f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10610 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
10620 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
10630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
10640 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  ize = n;.    }. 
10650 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e   }.  if( n==(PEN
10660 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
10670 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
10680 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     n++;.  }.  re
10690 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e  turn n;.}...#ifn
106a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
106b0 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43  MEMORYDB./*.** C
106c0 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79  lear a PgHistory
106d0 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63   block.*/.static
106e0 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f   void clearHisto
106f0 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48  ry(PgHistory *pH
10700 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  ist){.  sqliteFr
10710 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29  ee(pHist->pOrig)
10720 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
10730 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
10740 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
10750 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
10760 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
10770 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
10780 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
10790 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
107a0 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
107b0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
107c0 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a  l(Pager*);../*.*
107d0 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
107e0 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
107f0 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20  n. Also set the 
10800 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30  page number to 0
10810 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
10820 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
10830 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79   not part of any
10840 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69   hash chain. Thi
10850 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
10860 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c  cause the.** sql
10870 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
10880 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  e() routine can 
10890 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20  leave a page in 
108a0 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65  the .** pNextFre
108b0 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74  e/pPrevFree list
108c0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
108d0 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d  art of any hash-
108e0 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
108f0 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68   void unlinkHash
10900 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Chain(Pager *pPa
10910 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
10920 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  {.  if( pPg->pgn
10930 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  o==0 ){.    asse
10940 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
10950 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50  sh==0 && pPg->pP
10960 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
10970 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
10980 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
10990 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  sh ){.    pPg->p
109a0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
109b0 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
109c0 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
109d0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29  pPg->pPrevHash )
109e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
109f0 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d  ager->aHash[pPg-
10a00 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
10a10 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20  >nHash-1)]!=pPg 
10a20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
10a30 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
10a40 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
10a50 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
10a60 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e  int h = pPg->pgn
10a70 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
10a80 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65  sh-1);.    pPage
10a90 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
10aa0 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
10ab0 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
10ac0 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72  .    clearHistor
10ad0 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
10ae0 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
10af0 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d   }.  pPg->pgno =
10b00 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
10b10 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
10b20 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
10b30 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
10b40 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
10b50 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
10b60 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
10b70 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
10b80 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
10b90 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
10ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10bb0 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
10bc0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
10bd0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
10be0 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
10bf0 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
10c00 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
10c10 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
10c20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
10c30 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
10c40 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
10c50 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
10c60 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
10c70 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
10c80 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
10c90 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
10ca0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
10cb0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10cc0 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
10cd0 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
10ce0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
10cf0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
10d00 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
10d10 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
10d20 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
10d30 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
10d40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10d50 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
10d60 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
10d70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
10d80 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
10d90 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
10da0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
10db0 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
10dc0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
10dd0 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
10de0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10df0 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
10e00 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
10e10 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
10e20 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
10e30 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
10e40 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
10e50 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
10e60 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
10e70 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
10e80 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
10e90 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pPg);.}..#ifnde
10ea0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
10eb0 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69  MORYDB./*.** Thi
10ec0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
10ed0 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e  d to truncate an
10ee0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
10ef0 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20  ase.  Delete.** 
10f00 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
10f10 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74  pgno is larger t
10f20 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
10f30 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
10f40 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72  renced..** Refer
10f50 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
10f60 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
10f70 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
10f80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
10f90 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  d memoryTruncate
10fa0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10fb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
10fc0 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
10fd0 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
10fe0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
10ff0 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
11000 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
11010 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
11020 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
11030 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
11040 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
11050 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
11060 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
11070 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
11080 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
11090 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
110a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
110b0 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
110c0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
110d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110e0 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
110f0 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c  xtAll;.      unl
11100 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
11110 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
11120 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
11130 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
11140 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
11150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
11160 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f  lse.#define memo
11170 72 79 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65  ryTruncate(p).#e
11180 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ndif../*.** Try 
11190 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
111a0 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
111b0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
111c0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
111d0 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
111e0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
111f0 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
11200 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
11210 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
11220 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
11230 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
11240 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
11250 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
11260 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
11270 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
11280 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
11290 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
112a0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
112b0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
112c0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
112d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
112e0 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
112f0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
11300 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
11310 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
11320 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
11330 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
11340 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
11350 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
11360 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
11370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
11380 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
11390 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
113a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
113b0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
113c0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
113d0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
113e0 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
113f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
11400 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
11410 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
11420 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  e<0 || MEMDB );.
11430 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11440 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
11450 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11460 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
11470 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
11480 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
11490 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
114a0 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
114b0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
114c0 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
114d0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
114e0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
114f0 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
11500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11510 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
11520 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
11530 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
11540 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
11550 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
11560 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
11570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11580 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
11590 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
115a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
115b0 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
115c0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
115d0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
115e0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
115f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
11600 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
11610 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
11620 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71  || MEMDB );.  sq
11630 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
11640 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
11650 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
11660 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
11670 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
11680 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11690 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
116a0 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
116b0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
116c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
116d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
116e0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
116f0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
11700 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
11710 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
11720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11730 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  K;.  }.  rc = sy
11740 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
11750 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
11770 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
11780 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
11790 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
117a0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
117b0 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
117c0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
117d0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
117e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
117f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
11810 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72  urn rc;.  }..  r
11820 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
11830 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65  te(pPager, nPage
11840 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
11850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
11860 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
11870 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Page;.  }.  retu
11880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11890 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
118a0 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
118b0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
118c0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
118d0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
118e0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
118f0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
11900 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11910 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
11920 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
11930 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
11940 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
11950 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
11960 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
11970 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
11980 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
11990 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
119a0 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
119b0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
119c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
119d0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
119e0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
119f0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
11a00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
11a10 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
11a20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
11a30 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
11a40 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
11a50 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
11a60 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
11a70 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
11a80 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
11a90 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
11aa0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
11ab0 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
11ac0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
11ad0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
11ae0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
11af0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
11b00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
11b10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11b20 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
11b30 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  ENT.  /* A mallo
11b40 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  c() cannot fail 
11b50 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  in sqlite3Thread
11b60 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72  Data() as one or
11b70 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a   more calls to .
11b80 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75    ** malloc() mu
11b90 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
11ba0 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69  been made by thi
11bb0 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20  s thread before 
11bc0 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20  it gets.  ** to 
11bd0 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73  this point. This
11be0 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61   means the Threa
11bf0 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20  dData must have 
11c00 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
11c10 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74  lready.  ** so t
11c20 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
11c30 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74  Alloc can be set
11c40 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44  ..  */.  ThreadD
11c50 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
11c60 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
11c70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11c80 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
11c90 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c  Tsd && pTsd->nAl
11ca0 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  loc );.#endif.. 
11cb0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
11cc0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11cd0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
11ce0 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
11cf0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
11d00 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
11d10 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
11d20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
11d30 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11d40 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20    TRACE2("CLOSE 
11d50 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
11d60 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
11d70 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
11d80 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73 73  , pPager)).  ass
11d90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
11da0 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
11db0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
11dc0 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  && pPager->stmtO
11dd0 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  pen==0) );.  if(
11de0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11df0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
11e00 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
11e10 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
11e20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
11e30 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
11e40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
11e50 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
11e60 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
11e70 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d  ager->stfd);.  }
11e80 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
11e90 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
11ea0 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
11eb0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
11ec0 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
11ed0 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
11ee0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
11ef0 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
11f00 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
11f10 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
11f20 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20   }.  */..#ifdef 
11f30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
11f40 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
11f50 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
11f60 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c  pager from the l
11f70 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
11f80 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  gers starting at
11f90 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74   .  ** ThreadDat
11fa0 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f  a.pPager if memo
11fb0 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
11fc0 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20   enabled..  */. 
11fd0 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73   if( pPager==pTs
11fe0 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  d->pPager ){.   
11ff0 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
12000 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
12010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65   }else{.    Page
12020 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72  r *pTmp;.    for
12030 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50  (pTmp = pTsd->pP
12040 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  ager; pTmp->pNex
12050 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d  t!=pPager; pTmp=
12060 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20  pTmp->pNext){}. 
12070 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d     pTmp->pNext =
12080 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
12090 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
120a0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
120b0 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65  aHash);.  sqlite
120c0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
120d0 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74  pSpace);.  sqlit
120e0 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
120f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12100 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
12110 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
12120 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
12130 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
12140 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
12150 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
12160 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
12170 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
12180 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
12190 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
121a0 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
121b0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
121c0 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
121d0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
121e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
121f0 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
12200 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
12210 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
12220 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
12230 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
12240 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
12250 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
12260 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
12270 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
12280 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
12290 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
122a0 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
122b0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
122c0 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
122d0 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
122e0 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
122f0 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
12300 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
12310 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
12320 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
12330 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
12340 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
12350 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
12360 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
12370 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
12380 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
12390 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
123a0 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
123b0 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
123c0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
123d0 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
123e0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
123f0 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
12400 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
12410 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
12420 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
12430 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
12440 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
12450 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
12460 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
12470 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
12480 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
12490 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
124a0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
124b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
124c0 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
124d0 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
124e0 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
124f0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
12500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12510 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
12520 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
12530 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
12540 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
12550 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
12560 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
12570 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
12580 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
12590 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
125a0 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
125b0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
125c0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
125d0 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
125e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
125f0 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
12600 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
12610 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
12620 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
12630 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
12640 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
12650 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
12660 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
12670 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
12680 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
12690 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
126a0 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
126b0 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
126c0 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
126d0 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
126e0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
126f0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61  Page *pPg){.  pa
12700 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72  ge_ref(pPg);.  r
12710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
12730 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
12740 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
12750 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
12760 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
12770 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
12780 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
12790 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
127a0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
127b0 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
127c0 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
127d0 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
127e0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
127f0 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
12800 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
12810 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
12820 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
12830 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
12840 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
12850 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12860 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
12870 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
12880 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
12890 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
128a0 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
128b0 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
128c0 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
128d0 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
128e0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
128f0 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
12900 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
12910 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
12920 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
12930 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
12940 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
12950 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
12960 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
12970 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
12980 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
12990 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
129a0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
129b0 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
129c0 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
129d0 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
129e0 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
129f0 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
12a00 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
12a10 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
12a20 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
12a30 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
12a40 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
12a50 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
12a60 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
12a70 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
12a80 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
12a90 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
12aa0 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79  r failure, so sy
12ab0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
12ac0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
12ad0 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
12ae0 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
12af0 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
12b00 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
12b10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12b20 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
12b30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
12b40 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
12b50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
12b60 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
12b70 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64  urnal before mod
12b80 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ifying the main 
12b90 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61  database.  ** (a
12ba0 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73  ssuming there is
12bb0 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69   a journal and i
12bc0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  t needs to be sy
12bd0 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  nced.).  */.  if
12be0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
12bf0 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  nc ){.    if( !p
12c00 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
12c10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12c20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12c30 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a  Open );.      /*
12c40 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
12c50 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e  ->noSync ); // n
12c60 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73  oSync might be s
12c70 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  et if synchronou
12c80 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  s.      ** was t
12c90 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20  urned off after 
12ca0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12cb0 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69  was started.  Ti
12cc0 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66  cket #615 */.#if
12cd0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
12ce0 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    {.        /* M
12cf0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61  ake sure the pPa
12d00 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65  ger->nRec counte
12d10 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67  r we are keeping
12d20 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20   agrees.        
12d30 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  ** with the nRec
12d40 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
12d50 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
12d60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
12d70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12d80 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20  i64 jSz;.       
12d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12da0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
12db0 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
12dc0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
12dd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12de0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12df0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
12e00 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Sz );.      }.#e
12e10 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
12e20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
12e30 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
12e40 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
12e50 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
12e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
12e70 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
12e80 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
12e90 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
12ea0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
12eb0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
12ec0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
12ed0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
12ee0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
12ef0 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
12f00 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
12f10 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
12f20 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  k. .        */. 
12f30 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
12f40 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
12f50 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28           TRACE2(
12f60 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
12f70 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
12f80 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
12f90 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
12fa0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
12fb0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
12fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
12fd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
12fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12ff0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
13000 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13010 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13020 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
13030 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  jfd,.           
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13050 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
13060 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
13070 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
13080 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
13090 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
130a0 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
130b0 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
130c0 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
130d0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
130e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
130f0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
13100 69 63 29 2c 20 34 29 29 0a 20 20 20 20 20 20 20  ic), 4)).       
13110 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
13120 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
13130 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
13140 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
13150 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
13160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13170 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
13180 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
13190 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20  alOff);.        
131a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
131b0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
131c0 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a    TRACE2("SYNC j
131d0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
131e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
131f0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
13200 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22 2c 20  (("JSYNC %d\n", 
13210 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 72  pPager)).      r
13220 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
13230 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
13240 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
13250 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
13260 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
13270 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13280 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
13290 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
132a0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
132b0 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65  0;..    /* Erase
132c0 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
132d0 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61  ag from every pa
132e0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ge..    */.    f
132f0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
13300 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
13310 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
13320 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
13330 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
13340 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
13350 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
13360 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66  pFirst;.  }..#if
13370 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
13380 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
13390 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
133a0 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
133b0 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
133c0 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
133d0 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
133e0 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
133f0 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
13400 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
13410 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
13420 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
13430 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
13440 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
13450 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13460 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
13470 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  0 );.    }.    a
13480 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
13490 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61  FirstSynced==pPa
134a0 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20  ger->pFirst );. 
134b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
134c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
134d0 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73   Merge two lists
134e0 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63   of pages connec
134f0 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61 6e  ted by pDirty an
13500 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e  d in pgno order.
13510 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20  .** Do not both 
13520 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65 76  fixing the pPrev
13530 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a  Dirty pointers..
13540 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
13550 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28  *merge_pagelist(
13560 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72  PgHdr *pA, PgHdr
13570 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72   *pB){.  PgHdr r
13580 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20  esult, *pTail;. 
13590 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74   pTail = &result
135a0 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26  ;.  while( pA &&
135b0 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70   pB ){.    if( p
135c0 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f  A->pgno<pB->pgno
135d0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d   ){.      pTail-
135e0 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
135f0 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a      pTail = pA;.
13600 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70        pA = pA->p
13610 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
13620 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70  {.      pTail->p
13630 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20  Dirty = pB;.    
13640 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20    pTail = pB;.  
13650 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69      pB = pB->pDi
13660 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rty;.    }.  }. 
13670 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70   if( pA ){.    p
13680 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
13690 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  A;.  }else if( p
136a0 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  B ){.    pTail->
136b0 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d  pDirty = pB;.  }
136c0 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d  else{.    pTail-
136d0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d  >pDirty = 0;.  }
136e0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  .  return result
136f0 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  .pDirty;.}../*.*
13700 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20  * Sort the list 
13710 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  of pages in acce
13720 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
13730 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a  gno.  Pages are.
13740 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ** connected by 
13750 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  pDirty pointers.
13760 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74 79    The pPrevDirty
13770 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a   pointers are.**
13780 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74 68   corrupted by th
13790 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66  is sort..*/.#def
137a0 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
137b0 54 20 32 35 0a 73 74 61 74 69 63 20 50 67 48 64  T 25.static PgHd
137c0 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74  r *sort_pagelist
137d0 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20  (PgHdr *pIn){.  
137e0 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f  PgHdr *a[N_SORT_
137f0 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0a 20 20 69  BUCKET], *p;.  i
13800 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
13810 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
13820 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
13830 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
13840 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
13850 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
13860 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
13870 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
13880 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
13890 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
138a0 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
138b0 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
138c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
138d0 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
138e0 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
138f0 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
13900 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
13910 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
13920 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
13930 7b 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d  {.      a[i] = m
13940 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
13950 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  i], p);.    }.  
13960 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20  }.  p = a[0];.  
13970 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52  for(i=1; i<N_SOR
13980 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a  T_BUCKET; i++){.
13990 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
139a0 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b  gelist(p, a[i]);
139b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
139c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
139d0 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
139e0 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
139f0 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
13a00 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
13a10 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
13a20 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
13a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13a40 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
13a50 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
13a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a70 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
13a80 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
13a90 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
13aa0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
13ab0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
13ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ad0 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
13ae0 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
13af0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
13b00 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
13b10 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
13b20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
13b30 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
13b40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
13b50 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
13b60 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
13b70 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
13b80 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
13b90 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
13ba0 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
13bb0 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
13bc0 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
13bd0 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
13be0 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
13bf0 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
13c00 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
13c10 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
13c20 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
13c30 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
13c40 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
13c50 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
13c60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
13c70 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
13c80 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
13c90 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
13ca0 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
13cb0 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
13cc0 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
13cd0 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
13ce0 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
13cf0 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
13d00 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
13d10 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
13d20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
13d30 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
13d40 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
13d50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
13d60 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
13d70 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
13d80 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
13d90 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
13da0 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
13db0 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
13dc0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
13dd0 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
13de0 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
13df0 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
13e00 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
13e10 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
13e20 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
13e30 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
13e40 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
13e50 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
13e60 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
13e70 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
13e80 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
13e90 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
13ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13eb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
13ec0 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61   pList = sort_pa
13ed0 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20  gelist(pList);. 
13ee0 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
13ef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
13f00 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  st->dirty );.   
13f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
13f20 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
13f30 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
13f40 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
13f50 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
13f60 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13f70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
13f80 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
13f90 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
13fa0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
13fb0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
13fc0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
13fd0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
13fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
13ff0 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
14000 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
14010 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
14020 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
14030 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
14040 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
14050 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
14060 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
14070 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
14080 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
14090 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
140a0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
140b0 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50  Data = CODEC2(pP
140c0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
140d0 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
140e0 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
140f0 20 20 20 54 52 41 43 45 33 28 22 53 54 4f 52 45     TRACE3("STORE
14100 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
14110 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
14120 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
14130 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
14140 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
14150 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
14160 6e 6f 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20  no)).      rc = 
14170 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
14180 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
14190 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
141a0 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53 54 5f  ze);.      TEST_
141b0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
141c0 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ite);.    }.#ifn
141d0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
141e0 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
141f0 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
14200 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14210 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14220 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
14230 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
14240 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14250 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
14260 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
14270 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
14280 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
14290 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
142a0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
142b0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
142c0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
142d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
142e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
142f0 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
14300 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
14310 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
14320 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
14330 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
14340 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
14350 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
14360 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
14370 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
14380 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
14390 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
143a0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
143b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
143c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
143d0 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  ->pDirty;.}../*.
143e0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
143f0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
14400 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
14410 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
14420 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
14430 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
14440 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
14450 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14460 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
14470 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14480 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
14490 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
144a0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
144b0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
144c0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
144d0 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
144e0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
144f0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
14500 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
14510 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
14520 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
14530 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
14540 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
14550 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
14560 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
14570 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
14580 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
14590 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nal) ) return 0;
145a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
145b0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
145c0 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  k(pPager->fd) ) 
145d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
145e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
145f0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
14600 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
14610 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14620 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
14630 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
14640 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
14650 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
14660 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
14670 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
14680 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
14690 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
146a0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
146b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
146c0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
146d0 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
146e0 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
146f0 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
14700 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
14710 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
14720 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
14730 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
14740 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
14750 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
14760 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
14770 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
14780 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
14790 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
147a0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
147b0 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
147c0 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
147d0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
147e0 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61    */.  pPg = pPa
147f0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
14800 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
14810 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
14820 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
14830 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
14840 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
14850 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
14860 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
14870 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
14880 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
14890 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
148a0 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
148b0 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
148c0 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
148d0 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
148e0 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
148f0 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
14900 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e  r->pFirst && syn
14910 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
14920 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
14930 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
14940 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
14950 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14960 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
14970 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
14980 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  nc ){.      /* I
14990 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
149a0 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
149b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
149c0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
149d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
149e0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
149f0 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
14a00 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
14a10 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
14a20 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
14a30 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
14a40 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
14a50 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
14a60 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
14a70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14a80 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
14a90 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
14aa0 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
14ab0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
14ac0 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
14ad0 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
14ae0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
14af0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14b00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
14b10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14b20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
14b30 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  nc==0 );.      r
14b40 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
14b50 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
14b60 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
14b70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
14b80 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
14b90 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65  .    pPg = pPage
14ba0 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20  r->pFirst;.  }. 
14bb0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
14bc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14bd0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
14be0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
14bf0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
14c00 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
14c10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
14c20 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
14c30 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
14c40 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
14c50 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
14c60 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
14c70 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
14c80 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
14c90 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
14ca0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
14cb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
14cc0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
14cd0 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pg );.    if( rc
14ce0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14cf0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14d00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
14d10 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
14d20 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
14d30 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
14d40 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
14d50 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
14d60 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
14d70 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
14d80 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
14d90 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
14da0 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
14db0 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
14dc0 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
14dd0 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
14de0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
14df0 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65  .  ** It is nece
14e00 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
14e10 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
14e20 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
14e30 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67  ollback.  ** mig
14e40 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
14e50 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
14e60 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
14e70 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
14e80 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  er.  ** that is 
14e90 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
14ea0 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
14eb0 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
14ec0 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  pages must.  ** 
14ed0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
14ee0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
14ef0 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
14f00 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  */.  if( pPg->al
14f10 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
14f20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c      IOTRACE(("AL
14f30 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70  WAYS_ROLLBACK %p
14f40 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
14f50 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
14f60 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
14f70 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
14f80 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
14f90 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
14fa0 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
14fb0 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
14fc0 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54  age(pPg);.  TEST
14fd0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
14fe0 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  vfl);..  *ppPg =
14ff0 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
15000 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15020 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
15030 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
15040 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
15050 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
15060 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
15070 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
15080 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
15090 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
150a0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
150b0 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
150c0 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
150d0 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
150e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
150f0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
15100 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
15110 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
15120 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
15130 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
15140 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
15150 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
15160 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
15170 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
15180 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
15190 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
151a0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
151b0 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
151c0 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
151d0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
151e0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
151f0 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
15200 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
15210 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
15220 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  ){.  const Threa
15230 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20  dData *pTsdro = 
15240 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
15250 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50  aReadOnly();.  P
15260 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  ager *p;.  int n
15270 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
15280 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
15290 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
152a0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
152b0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
152c0 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
152d0 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
152e0 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
152f0 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
15300 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
15310 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
15320 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15330 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
15340 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
15350 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
15360 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
15370 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
15380 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30  lite3OsInMutex(0
15390 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
153a0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
153b0 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
153c0 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
153d0 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
153e0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
153f0 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
15400 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
15410 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
15420 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
15430 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
15440 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
15450 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
15460 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
15470 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
15480 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
15490 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
154a0 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
154b0 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
154c0 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
154d0 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
154e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
154f0 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  <=1; i++){..    
15500 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
15510 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
15520 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
15530 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15540 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ad. */.    for(p
15550 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b  =pTsdro->pPager;
15560 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c   p && (nReq<0 ||
15570 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
15580 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
15590 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
155a0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  .      int rc;..
155b0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63        /* For eac
155c0 68 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20  h pager, try to 
155d0 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67  free as many pag
155e0 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28  es as possible (
155f0 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a  without .      *
15600 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  * calling fsync(
15610 29 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  ) if this is the
15620 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
15630 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
15640 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  t .      ** loop
15650 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
15660 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
15670 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f  OK==(rc = pager_
15680 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70  recycle(p, i, &p
15690 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20  Pg)) && pPg) {. 
156a0 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
156b0 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
156c0 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
156d0 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
156e0 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
156f0 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
15700 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
15710 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
15720 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
15730 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
15740 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
15750 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
15760 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
15770 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
15780 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
15790 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
157a0 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
157b0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
157c0 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
157d0 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
157e0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
157f0 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
15800 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
15810 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
15820 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
15830 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
15840 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
15850 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
15860 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
15870 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
15880 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e      if( pPg==p->
15890 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
158a0 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67     p->pAll = pPg
158b0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
158c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
158d0 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70       for( pTmp=p
158e0 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
158f0 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
15900 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
15910 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
15920 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
15930 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
15940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15950 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
15960 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
15970 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
15980 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
15990 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
159a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
159b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
159c0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
159d0 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
159e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
159f0 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
15a00 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
15a10 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
15a20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
15a30 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
15a40 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
15a50 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
15a60 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
15a70 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
15a80 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
15a90 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
15aa0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
15ab0 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
15ac0 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
15ad0 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase .        ** 
15ae0 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
15af0 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
15b00 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
15b10 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
15b20 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
15b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
15b40 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
15b50 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c  IOERR || rc==SQL
15b60 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_FULL );.    
15b70 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15b80 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
15b90 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  RVED );.        
15ba0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72  pager_error(p, r
15bb0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
15bc0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
15bd0 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
15be0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
15bf0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
15c00 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
15c10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15c20 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
15c30 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
15c40 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
15c50 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
15c60 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
15c70 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
15c80 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
15c90 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
15ca0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
15cb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
15cc0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
15cd0 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
15ce0 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
15cf0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
15d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
15d10 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
15d20 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
15d30 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
15d40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
15d50 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
15d60 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
15d70 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
15d80 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
15d90 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
15da0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
15db0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
15dc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15dd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15de0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
15df0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15e00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15e10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15e20 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
15e30 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
15e40 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
15e50 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
15e60 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
15e70 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
15e80 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
15e90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
15ea0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
15eb0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
15ec0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
15ed0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
15ee0 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48  /.      if( hasH
15ef0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
15f00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
15f10 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
15f20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15f30 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
15f40 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
15f50 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72          ** impor
15f60 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
15f70 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
15f80 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
15f90 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
15fa0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
15fb0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
15fc0 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
15fd0 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
15fe0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
15ff0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
16000 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
16010 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
16020 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
16030 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16040 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
16050 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
16060 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
16070 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20  ing it .        
16080 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
16090 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   ** .        ** 
160a0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
160b0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
160c0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
160d0 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
160e0 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
160f0 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
16100 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
16110 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
16120 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  il to.        **
16130 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
16140 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16150 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16160 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
16170 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16180 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
16190 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
161a0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
161b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
161c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
161d0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
161e0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
161f0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16200 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16220 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16230 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
16240 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  E;. .        /* 
16250 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
16260 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
16270 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
16280 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
16290 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
162a0 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
162b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
162c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
162d0 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
162e0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
162f0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
16300 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
16310 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
16320 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
16330 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
16340 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
16350 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a   holds.        *
16360 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
16370 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
16380 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
16390 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
163a0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
163b0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
163c0 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
163d0 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a   time..        *
163e0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
163f0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
16400 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  Only(pPager->zJo
16410 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
16420 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jfd);.        if
16430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
16450 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
16460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
16470 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
16480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16490 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
164a0 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
164b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
164c0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
164d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
164e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
164f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16500 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
16510 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
16520 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
16530 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  .        /* Play
16540 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
16550 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
16560 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
16570 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
16580 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
16590 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
165a0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k..        */.  
165b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
165c0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
165d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
165e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
165f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
16600 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
16610 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
16630 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
16640 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
16650 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 31 20    PgHdr *pPage1 
16660 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
16670 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
16680 20 20 20 69 66 28 20 70 50 61 67 65 31 20 29 7b     if( pPage1 ){
16690 0a 20 20 20 20 20 20 20 20 20 20 75 6e 6c 69 6e  .          unlin
166a0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
166b0 72 2c 20 70 50 61 67 65 31 29 3b 0a 20 20 20 20  r, pPage1);.    
166c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 61      }..        a
166d0 73 73 65 72 74 28 20 21 70 61 67 65 72 5f 6c 6f  ssert( !pager_lo
166e0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 20  okup(pPager, 1) 
166f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
16700 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
16710 69 72 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  ire(pPager, 1, &
16720 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 20 20  pPage1, 0);.    
16730 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16740 54 45 5f 4f 4b 20 29 7b 0a 09 20 20 2f 2a 20 54  TE_OK ){..  /* T
16750 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
16760 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 6f  r is stored at o
16770 66 66 73 65 74 20 32 34 2e 20 53 65 65 20 61 6c  ffset 24. See al
16780 73 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  so.          ** 
16790 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
167a0 65 63 6f 75 6e 74 65 72 28 29 2e 0a 20 20 20 20  ecounter()..    
167b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
167c0 20 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f     u32 iChangeCo
167d0 75 6e 74 20 3d 20 72 65 74 72 69 65 76 65 33 32  unt = retrieve32
167e0 62 69 74 73 28 70 50 61 67 65 31 2c 20 32 34 29  bits(pPage1, 24)
167f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
16800 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
16810 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16820 65 72 55 6e 72 65 66 28 70 50 61 67 65 31 29 3b  erUnref(pPage1);
16830 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
16840 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  r->nRef--;.     
16850 20 20 20 20 20 69 66 28 20 69 43 68 61 6e 67 65       if( iChange
16860 43 6f 75 6e 74 21 3d 70 50 61 67 65 72 2d 3e 69  Count!=pPager->i
16870 43 68 61 6e 67 65 43 6f 75 6e 74 20 29 7b 0a 20  ChangeCount ){. 
16880 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72             pager
16890 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
168a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
168b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67  .            pag
168c0 65 72 53 6f 66 74 52 65 73 65 74 28 70 50 61 67  erSoftReset(pPag
168d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
168e0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
168f0 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20  r->iChangeCount 
16900 3d 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 3b 0a  = iChangeCount;.
16910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16920 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
16930 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
16940 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 0a 0a 20  R_SHARED;.  }.. 
16950 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16960 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
16970 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61  age..**.** A rea
16980 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69  d lock on the di
16990 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69  sk file is obtai
169a0 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72  ned when the fir
169b0 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69  st page is acqui
169c0 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65  red. .** This re
169d0 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70  ad lock is dropp
169e0 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ed when the last
169f0 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
16a00 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20  d..**.** A _get 
16a10 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
16a20 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
16a30 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
16a40 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
16a50 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
16a60 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
16a70 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
16a80 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
16a90 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
16aa0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
16ab0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
16ac0 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
16ad0 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
16ae0 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
16af0 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
16b00 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
16b10 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
16b20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
16b30 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
16b40 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
16b50 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
16b60 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
16b70 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
16b80 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
16b90 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
16ba0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
16bb0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
16bc0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
16bd0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
16be0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
16bf0 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
16c00 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
16c10 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74  nd _lookup() att
16c20 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
16c30 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
16c40 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
16c50 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
16c60 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
16c70 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
16c80 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
16c90 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
16ca0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f   it in whereas _
16cb0 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  lookup().** just
16cc0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
16cd0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
16ce0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
16cf0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
16d00 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
16d10 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
16d20 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
16d30 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
16d40 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
16d50 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e  ince _lookup() n
16d60 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
16d70 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
16d80 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
16d90 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
16da0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
16db0 20 63 6c 72 46 6c 61 67 20 69 73 20 66 61 6c 73   clrFlag is fals
16dc0 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
16dd0 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
16de0 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
16df0 2e 0a 2a 2a 20 49 66 20 63 6c 66 46 6c 61 67 20  ..** If clfFlag 
16e00 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
16e10 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 62  s the page is ab
16e20 6f 75 74 20 74 6f 20 62 65 20 65 72 61 73 65 64  out to be erased
16e30 20 61 6e 64 0a 2a 2a 20 72 65 77 72 69 74 74 65   and.** rewritte
16e40 6e 20 77 69 74 68 6f 75 74 20 66 69 72 73 74 20  n without first 
16e50 62 65 69 6e 67 20 72 65 61 64 20 73 6f 20 74 68  being read so th
16e60 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
16e70 69 74 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65 20  it doing.** the 
16e80 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74  disk I/O..*/.int
16e90 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
16ea0 75 69 72 65 28 50 61 67 65 72 20 2a 70 50 61 67  uire(Pager *pPag
16eb0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 44  er, Pgno pgno, D
16ec0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
16ed0 69 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a 20 20  int clrFlag){.  
16ee0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
16ef0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16f00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
16f10 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
16f20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c  pPager->nRef>0 |
16f30 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20  | pgno==1 );..  
16f40 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
16f50 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
16f60 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
16f70 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
16f80 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
16f90 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
16fa0 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
16fb0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
16fc0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
16fd0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
16fe0 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
16ff0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
17000 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
17010 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17020 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
17030 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
17040 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
17050 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
17060 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
17070 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
17080 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
17090 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
170a0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
170b0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
170c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
170d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
170e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
170f0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
17100 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
17110 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
17120 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
17130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
17140 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
17150 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67  rSharedLock(pPag
17160 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
17170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
17190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
171a0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
171b0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d  LOCK );..  pPg =
171c0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
171d0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
171e0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
171f0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
17200 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
17210 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
17220 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20   */.    int h;. 
17230 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
17240 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
17250 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
17260 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
17270 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69  e || pPager->pFi
17280 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20  rst==0 || MEMDB 
17290 7c 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  ||.        (pPag
172a0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
172b0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64  ==0 && pPager->d
172c0 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 20 20 29 7b  oNotSync).    ){
172d0 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
172e0 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
172f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
17300 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e  >nPage>=pPager->
17310 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20  nHash ){.       
17320 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
17330 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c  sh_table(pPager,
17340 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67  .           pPag
17350 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
17360 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
17370 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 20 20  ash*2);.        
17380 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  if( pPager->nHas
17390 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
173a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
173b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
173c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
173d0 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Pg = sqliteMallo
173e0 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50  cRaw( sizeof(*pP
173f0 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  g) + pPager->pag
17400 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  eSize.          
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
17430 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
17440 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
17470 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20  PgHistory) );.  
17480 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
17490 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
174a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
174b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
174c0 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65  set(pPg, 0, size
174d0 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20  of(*pPg));.     
174e0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
174f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
17500 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
17510 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
17520 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
17530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
17540 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
17550 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
17560 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
17570 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50  ->pAll;.      pP
17580 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
17590 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
175a0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
175b0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
175c0 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67  >pPager->nMaxPag
175d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
175e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61  ert( pPager->nMa
175f0 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e  xPage==(pPager->
17600 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20  nPage-1) );.    
17610 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78      pPager->nMax
17620 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Page++;.      }.
17630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17640 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
17650 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  cle(pPager, 1, &
17660 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
17670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17680 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17690 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
176a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
176b0 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
176c0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
176d0 73 65 72 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  sert(pPg);.    }
176e0 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
176f0 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70   pgno;.    if( p
17700 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17710 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
17720 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
17730 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
17740 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70  te3CheckMemory(p
17750 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17760 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20  l, pgno/8);.    
17770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17780 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
17790 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
177a0 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
177b0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
177c0 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
177d0 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70  7)))!=0;.      p
177e0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
177f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17800 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
17810 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
17820 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
17830 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
17840 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26  ager->aInStmt &&
17850 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
17860 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20  er->stmtSize.   
17870 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
17880 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67  ager->aInStmt[pg
17890 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
178a0 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  o&7)))!=0 ){.   
178b0 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
178c0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
178d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
178e0 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
178f0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
17900 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61 6b 65 43  .    }.    makeC
17910 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
17920 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
17930 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
17940 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
17950 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  f++;.    if( pPa
17960 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
17970 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
17980 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
17990 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
179a0 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
179b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
179c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
179d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
179e0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
179f0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
17a00 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20  >errCode;.      
17a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17a20 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74  ..    /* Populat
17a30 65 20 74 68 65 20 70 61 67 65 20 77 69 74 68 20  e the page with 
17a40 64 61 74 61 2c 20 65 69 74 68 65 72 20 62 79 20  data, either by 
17a50 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
17a60 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
17a70 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74   file, or by set
17a80 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20  ting the entire 
17a90 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20  page to zero..  
17aa0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
17ab0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
17ac0 6e 74 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29  nt(pPager)<(int)
17ad0 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 0a 20 20  pgno || MEMDB.  
17ae0 20 20 20 20 20 20 20 7c 7c 20 28 63 6c 72 46 6c         || (clrFl
17af0 61 67 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  ag && !pPager->a
17b00 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 0a  lwaysRollback) .
17b10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d      ){.      mem
17b20 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
17b30 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
17b40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
17b60 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
17b70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
17b80 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
17b90 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
17ba0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
17bb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
17bc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17be0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
17bf0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
17c00 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20  _TO_DATA(pPg),. 
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
17c30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
17c50 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
17c60 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
17c70 67 6e 6f 29 29 0a 20 20 20 20 20 20 54 52 41 43  gno)).      TRAC
17c80 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E3("FETCH %d pag
17c90 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
17ca0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17cb0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  gno);.      CODE
17cc0 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C1(pPager, PGHDR
17cd0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
17ce0 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
17cf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17d00 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
17d10 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
17d20 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
17d30 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
17d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
17d50 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
17d60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17d70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17d80 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52         TEST_INCR
17d90 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
17da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
17db0 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
17dc0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
17dd0 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
17de0 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  .    h = pgno & 
17df0 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
17e00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17e10 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  gno!=0 );.    pP
17e20 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
17e30 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
17e40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
17e50 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
17e60 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
17e70 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
17e80 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
17e90 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
17ea0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
17eb0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
17ec0 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
17ed0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
17ee0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
17ef0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
17f00 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
17f10 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
17f20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
17f30 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
17f40 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
17f50 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ache. */.    ass
17f60 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66  ert(pPager->nRef
17f70 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a  >0 || pgno==1);.
17f80 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
17f90 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
17fa0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
17fb0 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
17fc0 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
17fd0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17fe0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
17ff0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
18000 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
18010 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
18020 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
18030 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
18040 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
18050 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
18060 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
18070 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
18080 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
18090 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
180a0 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
180b0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
180c0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
180d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
180e0 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
180f0 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
18100 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
18110 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
18120 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
18130 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
18140 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
18150 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
18160 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
18170 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
18180 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
18190 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
181a0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
181b0 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
181c0 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
181d0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
181e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
181f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
18200 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
18210 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
18220 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18230 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
18240 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
18250 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 50 61  ;.  }.  if( (pPa
18260 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
18270 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
18280 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 29 7b  =SQLITE_FULL) ){
18290 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
182a0 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
182b0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
182c0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
182d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
182e0 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
182f0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
18300 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
18310 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
18320 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18330 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
18340 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
18350 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
18360 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
18370 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
18380 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
18390 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
183a0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
183b0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
183c0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
183d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
183e0 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
183f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18400 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
18410 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63  *pPg){..  /* Dec
18420 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
18430 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
18440 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
18450 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
18460 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
18470 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
18480 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
18490 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
184a0 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
184b0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
184c0 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
184d0 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
184e0 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
184f0 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
18500 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
18510 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
18520 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
18530 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
18540 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
18550 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
18560 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
18570 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
18580 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
18590 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
185a0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
185b0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
185c0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
185d0 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
185e0 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
185f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
18600 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
18610 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18620 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
18630 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
18640 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
18650 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
18660 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
18670 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
18680 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
18690 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
186a0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
186b0 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
186c0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
186d0 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
186e0 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
186f0 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
18700 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
18710 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
18720 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
18730 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
18740 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
18750 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
18760 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
18770 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ager->nRef==0 ){
18780 0a 20 20 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  .      /* pager_
18790 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a  reset(pPager); *
187a0 2f 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c  /.      pagerUnl
187b0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
187c0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
187d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
187e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
187f0 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
18800 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
18810 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
18820 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
18830 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
18840 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
18850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
18860 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
18870 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
18880 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18890 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
188a0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
188b0 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
188c0 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
188d0 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
188e0 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
188f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18900 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
18910 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18920 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
18930 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
18940 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18950 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
18960 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
18970 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
18980 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
18990 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
189a0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
189b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
189c0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
189d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
189e0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
189f0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
18a00 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
18a10 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
18a20 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
18a30 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
18a40 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
18a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
18a60 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  M;.    goto fail
18a70 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
18a80 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  al;.  }.  rc = s
18a90 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
18aa0 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a  usive(pPager->zJ
18ab0 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
18ac0 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >jfd,.          
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 74         pPager->t
18af0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67  empFile);.  pPag
18b00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
18b10 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
18b20 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
18b30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
18b40 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
18b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18b60 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
18b70 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
18b80 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
18b90 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72  tFullSync(pPager
18ba0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
18bb0 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71  ull_fsync);.  sq
18bc0 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79  lite3OsSetFullSy
18bd0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
18be0 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
18bf0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f  c);.  sqlite3OsO
18c00 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61  penDirectory(pPa
18c10 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
18c20 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  ->zDirectory);. 
18c30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18c40 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
18c50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
18c60 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
18c70 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
18c80 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
18c90 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
18ca0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
18cb0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
18cc0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
18cd0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
18ce0 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
18cf0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
18d00 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
18d10 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
18d20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
18d30 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
18d40 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
18d50 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
18d60 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
18d70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18d80 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
18d90 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
18da0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
18db0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18dc0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
18dd0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20  NOMEM ){.    rc 
18de0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
18df0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
18e00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18e10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
18e20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
18e30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18e40 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f   rc;..failed_to_
18e50 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20  open_journal:.  
18e60 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
18e70 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
18e80 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
18e90 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  rnal = 0;.  if( 
18ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
18eb0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
18ec0 69 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28  is was a malloc(
18ed0 29 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20  ) failure, then 
18ee0 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  we will not be c
18ef0 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65 72  losing the pager
18f00 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f  .    ** file. So
18f10 20 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72   delete any jour
18f20 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20  nal file we may 
18f30 68 61 76 65 20 6a 75 73 74 20 63 72 65 61 74 65  have just create
18f40 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  d. Otherwise,.  
18f50 20 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20    ** the system 
18f60 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65  will get confuse
18f70 64 2c 20 77 65 20 68 61 76 65 20 61 20 72 65 61  d, we have a rea
18f80 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  d-lock on the fi
18f90 6c 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20  le and a.    ** 
18fa0 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e  mysterious journ
18fb0 61 6c 20 68 61 73 20 61 70 70 65 61 72 65 64 20  al has appeared 
18fc0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
18fd0 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  m..    */.    sq
18fe0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
18ff0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
19000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61  .  }else{.    pa
19010 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
19020 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
19040 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
19050 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19060 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
19070 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
19080 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
19090 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
190a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
190b0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29  te3PagerCommit()
190c0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
190d0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
190e0 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
190f0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
19100 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
19110 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
19120 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
19130 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
19140 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
19150 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
19160 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
19170 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
19180 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
19190 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
191a0 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
191b0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
191c0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
191d0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
191e0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
191f0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
19200 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
19210 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
19220 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
19230 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
19240 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
19250 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
19260 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
19270 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
19280 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
19290 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
192a0 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
192b0 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
192c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
192d0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
192e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
192f0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
19300 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
19310 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
19320 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
19330 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
19340 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
19350 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
19360 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
19370 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
19380 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
19390 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
193a0 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
193b0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
193c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
193d0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
193e0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
193f0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
19400 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
19410 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
19420 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
19430 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
19440 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
19450 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
19460 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
19470 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
19480 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
19490 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
194a0 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
194b0 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
194c0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
194d0 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
194e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
194f0 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
19500 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
19510 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19520 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
19530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19540 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
19550 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
19560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
19570 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
19580 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
19590 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
195a0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
195b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
195c0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
195d0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
195e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
195f0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
19600 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
19610 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
19620 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
19630 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19650 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
19660 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
19670 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19690 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
196a0 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
196b0 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
196c0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
196d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
196e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
196f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
19700 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
19710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19730 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
19740 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
19750 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
19760 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
19770 20 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43   TRACE2("TRANSAC
19780 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
19790 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
197a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
197b0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
197c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
197d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
197e0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
197f0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
19800 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19810 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19820 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
19830 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20  dirty.  Set its 
19840 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61  dirty flag and a
19850 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72  dd it to the dir
19860 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e  ty.** page list.
19870 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19880 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20  makeDirty(PgHdr 
19890 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
198a0 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20  ->dirty==0 ){.  
198b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
198c0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
198d0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
198e0 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
198f0 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69  ty = pPager->pDi
19900 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61  rty;.    if( pPa
19910 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  ger->pDirty ){. 
19920 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69       pPager->pDi
19930 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
19940 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
19950 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
19960 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
19970 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  ->pDirty = pPg;.
19980 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
19990 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20  e a page clean. 
199a0 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79   Clear its dirty
199b0 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20   bit and remove 
199c0 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64  it from the.** d
199d0 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a  irty page list..
199e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
199f0 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a  akeClean(PgHdr *
19a00 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
19a10 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50  >dirty ){.    pP
19a20 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
19a30 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74    if( pPg->pDirt
19a40 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  y ){.      pPg->
19a50 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
19a60 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44  ty = pPg->pPrevD
19a70 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
19a80 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  if( pPg->pPrevDi
19a90 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67  rty ){.      pPg
19aa0 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
19ab0 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
19ac0 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
19ad0 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
19ae0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
19af0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
19b00 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  }.}.../*.** Mark
19b10 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
19b20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
19b30 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
19b40 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
19b50 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
19b60 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
19b70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
19b80 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
19b90 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
19ba0 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
19bb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
19bc0 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
19bd0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
19be0 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
19bf0 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
19c00 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
19c10 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
19c20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
19c30 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
19c40 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
19c50 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
19c60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
19c70 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
19c80 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
19c90 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
19ca0 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
19cb0 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
19cc0 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
19cd0 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
19ce0 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
19cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
19d00 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
19d10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
19d20 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
19d30 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
19d40 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
19d50 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
19d60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
19d70 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
19d80 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
19d90 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
19da0 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
19db0 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
19dc0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
19dd0 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
19de0 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
19df0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
19e00 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
19e10 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
19e20 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
19e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19e40 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
19e50 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
19e60 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54  *pData = PGHDR_T
19e70 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50  O_DATA(pPg);.  P
19e80 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19e90 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
19ea0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19eb0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
19ec0 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
19ed0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
19ee0 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
19ef0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
19f00 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
19f10 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
19f20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19f30 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
19f40 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
19f50 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
19f60 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
19f70 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
19f80 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
19f90 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
19fa0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
19fb0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
19fc0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
19fd0 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
19fe0 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
19ff0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
1a000 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
1a010 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
1a020 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
1a030 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
1a040 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
1a050 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1a060 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
1a070 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
1a080 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
1a090 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
1a0a0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
1a0b0 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
1a0c0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1a0d0 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
1a0e0 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
1a0f0 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
1a100 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
1a110 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
1a120 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1a130 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
1a140 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
1a150 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
1a160 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
1a170 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1a180 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1a190 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
1a1a0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1a1b0 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  (pPg, 0);.    if
1a1c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a1d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a1e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
1a1f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a200 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1a210 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21  VED );.    if( !
1a220 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a230 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
1a240 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
1a250 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1a260 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1a270 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1a280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1a290 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a2a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a2b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1a2c0 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
1a2d0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
1a2e0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1a2f0 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
1a300 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1a310 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
1a320 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
1a330 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
1a340 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1a350 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
1a360 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a370 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
1a380 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
1a390 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
1a3a0 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
1a3b0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
1a3c0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
1a3d0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
1a3e0 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
1a3f0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d  >useJournal || M
1a400 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
1a410 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
1a420 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
1a430 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
1a440 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
1a450 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1a460 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69  {.          PgHi
1a470 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1a480 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1a490 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1a4a0 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55       TRACE3("JOU
1a4b0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1a4c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1a4d0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1a4e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1a4f0 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d  t( pHist->pOrig=
1a500 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1a510 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73  pHist->pOrig = s
1a520 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1a530 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a540 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1a550 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
1a560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1a570 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69  mcpy(pHist->pOri
1a580 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  g, PGHDR_TO_DATA
1a590 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1a5a0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1a5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1a5c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
1a5d0 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b  32 cksum, saved;
1a5e0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
1a5f0 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a  *pData2, *pEnd;.
1a600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
1a610 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
1a620 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
1a630 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
1a640 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1a650 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
1a660 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
1a670 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1a680 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
1a690 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1a6a0 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
1a6b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a6c0 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
1a6d0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1a6e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   );.          pD
1a6f0 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
1a700 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1a710 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
1a720 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
1a730 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
1a740 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
1a750 20 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d            pEnd =
1a760 20 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72   pData2 + pPager
1a770 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1a780 20 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20        pData2 -= 
1a790 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  4;.          sav
1a7a0 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64  ed = *(u32*)pEnd
1a7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33  ;.          put3
1a7c0 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75  2bits(pEnd, cksu
1a7d0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  m);.          sz
1a7e0 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg = pPager->pag
1a7f0 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20  eSize+8;.       
1a800 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61     put32bits(pDa
1a810 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ta2, pPg->pgno);
1a820 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1a830 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1a840 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
1a850 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20  a2, szPg);.     
1a860 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1a870 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
1a880 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1a890 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1a8b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1a8c0 73 7a 50 67 29 29 0a 20 20 20 20 20 20 20 20 20  szPg)).         
1a8d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a8e0 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20  Off += szPg;.   
1a8f0 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a         TRACE4("J
1a900 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1a910 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1a920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a930 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1a940 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1a950 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
1a960 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a            *(u32*
1a970 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a  )pEnd = saved;..
1a980 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68  .  /* An error h
1a990 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69  as occured writi
1a9a0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
1a9b0 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
1a9c0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1a9d0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
1a9e0 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
1a9f0 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
1aa00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1aa10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1aa20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aa30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1aa40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
1aa50 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1aa60 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
1aa70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1aa80 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1aa90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1aaa0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1aab0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1aac0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1aad0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  ;.          pPg-
1aae0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
1aaf0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
1ab00 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1ab10 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1ab30 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1ab40 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1ab50 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1ab60 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61            page_a
1ab70 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1ab80 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1ab90 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1aba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1abb0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1abc0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1abd0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
1abe0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
1abf0 20 20 20 20 20 54 52 41 43 45 34 28 22 41 50 50       TRACE4("APP
1ac00 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
1ac10 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1ac30 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1ac40 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1ac50 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
1ac60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
1ac70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1ac80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
1ac90 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1aca0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
1acb0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1acc0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
1acd0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1ace0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
1acf0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
1ad00 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
1ad10 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
1ad20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
1ad30 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1ad40 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
1ad50 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
1ad60 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
1ad70 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
1ad80 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
1ad90 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
1ada0 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
1adb0 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
1adc0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
1add0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
1ade0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1adf0 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1ae00 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1ae10 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1ae20 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1ae30 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1ae40 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
1ae50 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
1ae60 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1ae70 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
1ae80 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
1ae90 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1aea0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1aeb0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1aec0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
1aed0 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
1aee0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
1aef0 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
1af00 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
1af10 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
1af20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
1af30 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
1af40 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
1af50 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
1af60 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
1af70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1af80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
1af90 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1afa0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1afb0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1afc0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1afd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1afe0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1aff0 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1b000 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1b010 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20  gno, 7)-4;.     
1b020 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61     put32bits(pDa
1b030 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ta2, pPg->pgno);
1b040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b050 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1b060 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61  ger->stfd, pData
1b070 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1b080 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  ize+4);.        
1b090 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
1b0a0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1b0b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b0c0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1b0d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b0e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b0f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b100 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1b110 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
1b120 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  tNRec++;.       
1b130 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b140 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1b150 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
1b160 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1b170 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1b180 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d  pgno&7);.      }
1b190 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
1b1a0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1b1b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1b1c0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1b1d0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1b1e0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
1b1f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1b200 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1b210 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1b220 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
1b230 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1b240 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1b250 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1b260 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1b270 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1b280 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1b290 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1b2a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1b2b0 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1b2c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b2d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b2e0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1b2f0 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
1b300 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
1b310 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
1b320 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
1b330 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1b340 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1b350 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
1b360 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
1b370 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
1b380 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
1b390 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1b3a0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
1b3b0 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
1b3c0 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
1b3d0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1b3e0 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
1b3f0 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
1b400 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
1b410 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
1b420 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
1b430 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
1b440 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
1b450 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
1b460 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1b470 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1b480 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
1b490 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
1b4a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1b4b0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1b4c0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
1b4d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
1b4e0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1b4f0 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1b500 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1b510 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
1b520 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
1b530 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
1b540 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1b550 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  ..  if( !MEMDB &
1b560 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  & nPagePerSector
1b570 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
1b580 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
1b590 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1b5a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1b5b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1b5c0 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b5e0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
1b5f0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1b600 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
1b610 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b630 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1b640 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
1b650 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
1b660 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
1b670 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
1b680 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
1b690 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1b6a0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
1b6b0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
1b6c0 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
1b6d0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
1b6e0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
1b6f0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1b700 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1b710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b720 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
1b730 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1b740 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
1b750 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
1b760 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
1b770 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
1b780 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
1b790 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
1b7a0 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
1b7b0 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
1b7c0 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
1b7d0 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
1b7e0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1b7f0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1b800 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1b810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
1b820 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
1b830 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
1b840 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
1b850 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
1b860 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1b870 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1b880 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1b890 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1b8a0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
1b8b0 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
1b8c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1b8d0 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
1b8e0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
1b8f0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1b900 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
1b910 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
1b920 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1b930 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1b940 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
1b950 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
1b960 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
1b970 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
1b980 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
1b990 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
1b9a0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1b9b0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1b9c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
1b9d0 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
1b9e0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1b9f0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  r->aInJournal ||
1ba00 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
1ba10 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e  | .          pg>
1ba20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ba30 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e  ze || !(pPager->
1ba40 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d  aInJournal[pg/8]
1ba50 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20  &(1<<(pg&7))).  
1ba60 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20      ) {.        
1ba70 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1ba80 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1ba90 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
1baa0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1bab0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bac0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1bad0 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
1bae0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1baf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bb00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1bb10 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1bb20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1bb30 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1bb40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1bb50 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1bb60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1bb70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1bb80 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
1bb90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1bba0 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
1bbb0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1bbc0 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
1bbd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1bbe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1bbf0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1bc00 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
1bc10 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
1bc20 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
1bc30 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1bc40 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
1bc50 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1bc60 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1bc70 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1bc80 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1bc90 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1bca0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1bcb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1bcc0 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
1bcd0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
1bce0 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
1bcf0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1bd00 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
1bd10 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
1bd20 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1bd30 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
1bd40 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1bd50 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
1bd60 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
1bd70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  t sqlite3PagerOv
1bd80 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
1bd90 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1bda0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
1bdb0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1bdc0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1bdd0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1bde0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
1bdf0 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Pg);.  if( rc==S
1be00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1be10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1be20 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1be30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1be40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
1be50 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47  py(sqlite3PagerG
1be60 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61  etData(pPg), pDa
1be70 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1be80 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
1be90 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1bea0 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  ef(pPg);.  }.  r
1beb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1bec0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
1bed0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1bee0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1bef0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1bf00 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
1bf10 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
1bf20 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
1bf30 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
1bf40 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
1bf50 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
1bf60 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
1bf70 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
1bf80 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
1bf90 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
1bfa0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1bfb0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
1bfc0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
1bfd0 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
1bfe0 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
1bff0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
1c000 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
1c010 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
1c020 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
1c030 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
1c040 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
1c050 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
1c060 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
1c070 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
1c080 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
1c090 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1c0a0 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1c0b0 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1c0c0 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1c0d0 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1c0e0 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1c0f0 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1c100 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1c110 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1c120 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1c130 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1c140 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1c150 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
1c160 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1c170 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
1c180 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
1c190 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
1c1a0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1c1b0 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
1c1c0 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
1c1d0 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
1c1e0 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
1c1f0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1c200 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
1c210 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
1c220 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
1c230 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1c240 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
1c250 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
1c260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1c270 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
1c280 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
1c290 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
1c2a0 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
1c2b0 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
1c2c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1c2d0 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
1c2e0 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f  ,.** the dont_ro
1c2f0 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
1c300 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
1c310 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
1c320 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72  e contains.** cr
1c330 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
1c340 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
1c350 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f   sure it gets ro
1c360 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
1c370 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e  te.** of the don
1c380 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  t_rollback() cal
1c390 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
1c3a0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1c3b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1c3c0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1c3d0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1c3e0 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1c3f0 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
1c400 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1c410 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
1c420 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65  pPg!=0 );  /* We
1c430 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e   never call _don
1c440 74 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74  t_write unless t
1c450 68 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65  he page is in me
1c460 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61  m */.  pPg->alwa
1c470 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
1c480 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1c490 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
1c4a0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
1c4b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c4c0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1c4d0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1c4e0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
1c4f0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
1c500 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c510 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
1c520 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1c530 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
1c540 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
1c550 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
1c560 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
1c570 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
1c580 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1c590 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
1c5a0 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
1c5b0 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
1c5c0 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
1c5d0 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
1c5e0 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
1c5f0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
1c600 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
1c610 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
1c620 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
1c630 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
1c640 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
1c650 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
1c660 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
1c670 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
1c680 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
1c690 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
1c6a0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
1c6b0 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
1c6c0 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
1c6d0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1c6e0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
1c6f0 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
1c700 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
1c710 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1c720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
1c730 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54  RACE3("DONT_WRIT
1c740 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
1c750 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49  n", pgno, PAGERI
1c760 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1c770 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
1c780 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1c790 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20 20  er, pgno)).     
1c7a0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
1c7b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1c7c0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
1c7d0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1c7e0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1c7f0 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
1c800 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1c810 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1c820 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1c830 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
1c840 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1c850 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
1c860 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
1c870 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
1c880 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
1c890 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
1c8a0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
1c8b0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
1c8c0 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
1c8d0 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
1c8e0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1c8f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c900 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1c910 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  k(DbPage *pPg){.
1c920 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c930 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
1c940 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c950 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1c960 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
1c970 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c980 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
1c990 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
1c9a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
1c9b0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1c9c0 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29  lback || MEMDB )
1c9d0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
1c9e0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
1c9f0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1ca00 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
1ca10 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  DbSize ){.    as
1ca20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1ca30 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
1ca40 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1ca50 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
1ca60 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1ca70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d  gno&7);.    pPg-
1ca80 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1ca90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1caa0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1cab0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1cac0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1cad0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1cae0 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f  &7);.      page_
1caf0 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1cb00 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
1cb10 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f   TRACE3("DONT_RO
1cb20 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
1cb30 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
1cb40 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1cb50 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  er));.    IOTRAC
1cb60 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
1cb70 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1cb80 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20  g->pgno)).  }.  
1cb90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1cba0 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1cbb0 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1cbc0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1cbd0 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1cbe0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1cbf0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1cc00 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1cc10 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1cc20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cc30 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1cc40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1cc50 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1cc60 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1cc70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
1cc80 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1cc90 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
1cca0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
1ccb0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1ccc0 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
1ccd0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1cce0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1ccf0 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
1cd00 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
1cd10 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
1cd20 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
1cd30 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1cd40 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
1cd50 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
1cd60 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
1cd70 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1cd80 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1cd90 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  Commit(Pager *pP
1cda0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1cdb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1cdc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1cdd0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
1cde0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1cdf0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1ce00 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
1ce10 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
1ce20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ce30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52  _ERROR;.  }.  TR
1ce40 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
1ce50 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1ce60 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1ce70 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
1ce80 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
1ce90 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
1cea0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
1ceb0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48   ){.      clearH
1cec0 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
1ced0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1cee0 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ));.      pPg->d
1cef0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
1cf00 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1cf10 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
1cf20 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
1cf30 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1cf40 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
1cf50 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
1cf60 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1cf70 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1cf80 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
1cf90 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1cfa0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44   = 0;.#ifndef ND
1cfb0 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67  EBUG.    for(pPg
1cfc0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1cfd0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1cfe0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
1cff0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1d000 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1d010 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1d020 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
1d030 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1d040 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d050 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
1d060 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d070 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
1d080 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1d090 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1d0a0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1d0b0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1d0c0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1d0d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1d0e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1d0f0 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a  irtyCache==0 ){.
1d100 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c      /* Exit earl
1d110 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  y (without doing
1d120 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d   the time-consum
1d130 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  ing sqlite3OsSyn
1d140 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a  c() calls).    *
1d150 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20  * if there have 
1d160 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
1d170 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d180 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
1d190 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1d1a0 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
1d1b0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1d1c0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1d1d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d1e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
1d1f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d200 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1d210 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1d220 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  er, 0, 0);.  if(
1d230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d240 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1d250 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1d260 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
1d270 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d280 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
1d290 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
1d2a0 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
1d2b0 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
1d2c0 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
1d2d0 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
1d2e0 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
1d2f0 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
1d300 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
1d310 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
1d320 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
1d330 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
1d340 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
1d350 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
1d360 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
1d370 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
1d380 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
1d390 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
1d3a0 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
1d3b0 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
1d3c0 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
1d3d0 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
1d3e0 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
1d3f0 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
1d400 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
1d410 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
1d420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
1d430 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1d440 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
1d450 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
1d460 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
1d470 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
1d480 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d490 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
1d4a0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1d4b0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
1d4c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52  {.  int rc;.  TR
1d4d0 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE2("ROLLBACK %
1d4e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1d4f0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
1d500 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
1d510 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
1d520 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
1d530 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
1d540 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1d550 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73  *pHist;.      as
1d560 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73  sert( !p->always
1d570 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
1d580 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20    if( !p->dirty 
1d590 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1d5a0 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
1d5b0 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
1d5c0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72  p, pPager))->pOr
1d5d0 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ig );.        as
1d5e0 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
1d5f0 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
1d600 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
1d610 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  pStmt );.       
1d620 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1d630 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20   }..      pHist 
1d640 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1d650 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  p, pPager);.    
1d660 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
1d670 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  ig ){.        me
1d680 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
1d690 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f  TA(p), pHist->pO
1d6a0 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  rig, pPager->pag
1d6b0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1d6c0 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
1d6d0 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
1d6e0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
1d6f0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1d700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d710 20 20 20 54 52 41 43 45 33 28 22 50 41 47 45 20     TRACE3("PAGE 
1d720 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25  %d is clean on %
1d730 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
1d740 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1d750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1d760 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
1d770 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72  t);.      p->dir
1d780 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ty = 0;.      p-
1d790 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
1d7a0 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20        p->inStmt 
1d7b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = 0;.      p->pP
1d7c0 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65  revStmt = p->pNe
1d7d0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1d7e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
1d7f0 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
1d800 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
1d810 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e  iter(p, pPager->
1d820 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1d830 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
1d840 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
1d850 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
1d860 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
1d870 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1d880 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1d890 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
1d8a0 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
1d8b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1d8c0 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
1d8d0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1d8e0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
1d8f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d900 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1d910 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
1d920 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
1d930 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
1d940 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1d950 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1d960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d970 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1d980 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
1d990 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
1d9a0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
1d9b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1d9c0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
1d9d0 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
1d9e0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1d9f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1da00 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1da10 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1da20 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1da30 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1da40 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1da50 20 20 20 20 2f 2a 20 72 63 20 3d 20 70 61 67 65      /* rc = page
1da60 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
1da70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 20 20 72  Pager); */.    r
1da80 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1da90 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
1daa0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75     rc2 = pager_u
1dab0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
1dac0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
1dad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dae0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
1daf0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1db00 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1db10 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
1db20 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
1db30 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a  Size = -1;..  /*
1db40 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1db50 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
1db60 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
1db70 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
1db80 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63  e pager.  ** cac
1db90 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
1dba0 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
1dbb0 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
1dbc0 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a   any error .  **
1dbd0 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a   persistent..  *
1dbe0 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  /.  return pager
1dbf0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1dc00 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c);.}../*.** Ret
1dc10 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1dc20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1dc30 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
1dc40 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
1dc50 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
1dc60 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
1dc70 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
1dc80 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1dc90 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  Isreadonly(Pager
1dca0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1dcb0 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
1dcc0 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Only;.}../*.** R
1dcd0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1dce0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1dcf0 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  o the pager..*/.
1dd00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1dd10 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  Refcount(Pager *
1dd20 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1dd30 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  n pPager->nRef;.
1dd40 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1dd50 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
1dd60 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1dd70 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
1dd80 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
1dd90 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
1dda0 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
1ddb0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
1ddc0 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
1ddd0 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
1dde0 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
1ddf0 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
1de00 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
1de10 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
1de20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1de30 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
1de40 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
1de50 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1de60 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
1de70 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
1de80 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
1de90 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d    a[8] = pPager-
1dea0 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d  >nOvfl;.  a[9] =
1deb0 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
1dec0 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
1ded0 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
1dee0 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
1def0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
1df00 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
1df10 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
1df20 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
1df30 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
1df40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1df50 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
1df60 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
1df70 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1df80 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
1df90 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
1dfa0 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
1dfb0 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
1dfc0 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
1dfd0 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
1dfe0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
1dff0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
1e000 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  mtBegin(Pager *p
1e010 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e020 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
1e030 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1e040 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e050 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1e060 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73  _SHARED );.  ass
1e070 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
1e080 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43  ize>=0 );.  TRAC
1e090 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
1e0a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1e0b0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
1e0c0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
1e0d0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
1e0e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1e0f0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
1e100 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74  >dbSize;.    ret
1e110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e120 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
1e130 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
1e140 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1e150 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
1e160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e170 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
1e180 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1e190 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67  alOpen );.  pPag
1e1a0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71  er->aInStmt = sq
1e1b0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
1e1c0 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
1e1d0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1e1e0 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a  ->aInStmt==0 ){.
1e1f0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
1e200 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1e210 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a   SHARED_LOCK); *
1e220 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1e230 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
1e240 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1e250 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1e260 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1e270 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d  fd, &pPager->stm
1e280 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
1e290 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
1e2a0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73  gin_failed;.  as
1e2b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1e2c0 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65  mtJSize == pPage
1e2d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
1e2e0 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
1e2f0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50  ->stmtJSize = pP
1e300 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1e310 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1e320 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1e330 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  bSize;.  pPager-
1e340 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b  >stmtHdrOff = 0;
1e350 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43  .  pPager->stmtC
1e360 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
1e370 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20  ksumInit;.  if( 
1e380 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
1e390 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
1e3a0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
1e3b0 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  mp(&pPager->stfd
1e3c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e3d0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1e3e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
1e3f0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
1e400 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1e410 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
1e420 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1e430 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
1e440 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
1e450 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
1e460 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
1e470 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
1e480 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
1e490 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
1e4a0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1e4b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1e4c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1e4d0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
1e4e0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1e4f0 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
1e500 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e510 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1e520 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1e530 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
1e540 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22  xt;.    TRACE2("
1e550 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
1e560 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1e570 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
1e580 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
1e590 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
1e5a0 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
1e5b0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
1e5c0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
1e5d0 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  stfd, 0); */.   
1e5e0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
1e5f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1e600 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1e610 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
1e620 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70   }.    for(pPg=p
1e630 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
1e640 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
1e650 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67       pNext = pPg
1e660 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20  ->pNextStmt;.   
1e670 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1e680 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  inStmt );.      
1e690 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
1e6a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1e6b0 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1e6c0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1e6d0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1e6e0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1e6f0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1e700 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1e710 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
1e720 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
1e730 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
1e740 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1e750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e760 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1e770 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
1e780 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1e790 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1e7a0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
1e7b0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1e7c0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
1e7d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e7e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1e7f0 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
1e800 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e810 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50  erStmtRollback(P
1e820 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e830 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
1e840 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1e850 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22   ){.    TRACE2("
1e860 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
1e870 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1e880 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
1e890 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
1e8a0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
1e8b0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1e8c0 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
1e8d0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
1e8e0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1e8f0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1e900 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1e910 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1e920 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1e930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1e940 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
1e950 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
1e960 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
1e970 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1e980 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1e990 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1e9a0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1e9b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1e9c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e9d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1e9e0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
1e9f0 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
1ea00 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
1ea10 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1ea20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1ea30 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1ea40 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
1ea50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1ea60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
1ea70 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
1ea80 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
1ea90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1eaa0 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
1eab0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
1eac0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1ead0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1eae0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1eaf0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1eb00 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
1eb10 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
1eb20 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
1eb30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1eb40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
1eb50 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
1eb60 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
1eb70 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
1eb80 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1eb90 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1eba0 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
1ebb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ebc0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1ebd0 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
1ebe0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ebf0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
1ec00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ec10 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
1ec20 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
1ec30 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
1ec40 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1ec50 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
1ec60 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
1ec70 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
1ec80 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
1ec90 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
1eca0 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
1ecb0 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
1ecc0 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
1ecd0 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
1ece0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
1ecf0 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
1ed00 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1ed10 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
1ed20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1ed30 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
1ed40 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
1ed50 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
1ed60 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
1ed70 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
1ed80 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
1ed90 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
1eda0 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
1edb0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
1edc0 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
1edd0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
1ede0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
1edf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1ee00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
1ee10 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64   increment the d
1ee20 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
1ee30 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20  nge-counter,.** 
1ee40 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32  stored at byte 2
1ee50 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  4 of the pager f
1ee60 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1ee70 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
1ee80 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
1ee90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
1eea0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
1eeb0 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1eec0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1eed0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1eee0 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1eef0 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  riting. */.  rc 
1ef00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1ef10 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
1ef20 67 48 64 72 29 3b 0a 20 20 69 66 28 20 72 63 21  gHdr);.  if( rc!
1ef30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1ef40 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
1ef50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ef60 28 70 50 67 48 64 72 29 3b 0a 20 20 69 66 28 20  (pPgHdr);.  if( 
1ef70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ef80 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1ef90 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e   Read the curren
1efa0 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20  t value at byte 
1efb0 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1efc0 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65  counter = retrie
1efd0 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c  ve32bits(pPgHdr,
1efe0 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72   24);..  /* Incr
1eff0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1f000 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1f010 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1f020 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1f030 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
1f040 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1f050 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
1f060 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
1f070 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1f080 20 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65   pPager->iChange
1f090 43 6f 75 6e 74 20 3d 20 63 68 61 6e 67 65 5f 63  Count = change_c
1f0a0 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 52 65  ounter;..  /* Re
1f0b0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
1f0c0 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73  eference. */.  s
1f0d0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f0e0 28 70 50 67 48 64 72 29 3b 0a 20 20 72 65 74 75  (pPgHdr);.  retu
1f0f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f100 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1f110 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1f120 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
1f130 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
1f140 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
1f150 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
1f160 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1f170 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1f180 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
1f190 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
1f1a0 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
1f1b0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
1f1c0 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
1f1d0 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
1f1e0 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
1f1f0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1f200 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1f210 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
1f220 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
1f230 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
1f240 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1f250 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
1f260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f270 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1f280 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
1f290 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
1f2a0 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
1f2b0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
1f2c0 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
1f2d0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1f2e0 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
1f2f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1f300 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
1f310 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1f320 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
1f330 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
1f340 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
1f350 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
1f360 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
1f370 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 63 61  e3PagerSync() ca
1f380 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
1f390 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
1f3a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1f3b0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
1f3c0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
1f3d0 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
1f3e0 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
1f3f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1f400 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73  bases)..*/.int s
1f410 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
1f420 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
1f430 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1f440 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29  er, Pgno nTrunc)
1f450 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f460 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45  ITE_OK;..  TRACE
1f470 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  4("DATABASE SYNC
1f480 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
1f490 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e  r=%s nTrunc=%d\n
1f4a0 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
1f4b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
1f4c0 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a  ster, nTrunc);..
1f4d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1f4e0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
1f4f0 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
1f500 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
1f510 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
1f520 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
1f530 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1f540 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
1f550 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1f560 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1f570 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44  _SYNCED && !MEMD
1f580 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72  B && pPager->dir
1f590 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50  tyCache ){.    P
1f5a0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61  gHdr *pPg;.    a
1f5b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1f5c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20  ournalOpen );.. 
1f5d0 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
1f5e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1f5f0 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
1f600 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1f610 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
1f620 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
1f630 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
1f640 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
1f650 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
1f660 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
1f670 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
1f680 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
1f690 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
1f6a0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1f6b0 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
1f6c0 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
1f6d0 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
1f6e0 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
1f6f0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
1f700 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
1f710 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1f720 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
1f730 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1f740 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
1f750 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
1f760 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1f770 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f790 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1f7a0 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  it;.#ifndef SQLI
1f7b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1f7c0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72  UM.      if( nTr
1f7d0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
1f7e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
1f7f0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
1f800 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1f810 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
1f820 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a   pages.        *
1f830 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
1f840 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
1f850 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
1f860 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
1f870 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1f880 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
1f890 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20         Pgno i;. 
1f8a0 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70         int iSkip
1f8b0 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
1f8c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f8d0 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
1f8e0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
1f8f0 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
1f900 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1f910 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1f920 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28  nal[i/8] & (1<<(
1f930 69 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b  i&7))) && i!=iSk
1f940 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
1f950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f960 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
1f970 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
1f980 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f990 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1f9a0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1f9b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f9c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
1f9d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1f9e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1f9f0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1fa00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fa10 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fa20 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1fa30 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  }.        } .   
1fa40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1fa50 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
1fa60 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1fa70 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1fa80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fa90 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1faa0 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
1fab0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1fac0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1fad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1fae0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1faf0 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
1fb00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fb10 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
1fb20 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1fb30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb40 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
1fb50 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
1fb60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fb70 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fb80 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
1fb90 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
1fba0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1fbb0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fbc0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
1fbd0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
1fbe0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
1fbf0 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ger);.    rc = p
1fc00 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1fc10 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
1fc20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fc30 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1fc40 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
1fc50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fc60 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
1fc70 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1fc80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fc90 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1fca0 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  >fd, 0);.    }. 
1fcb0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
1fcc0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1fcd0 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
1fce0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1fcf0 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  YNCED;.  }else i
1fd00 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75  f( MEMDB && nTru
1fd10 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nc!=0 ){.    rc 
1fd20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
1fd30 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
1fd40 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e  Trunc);.  }..syn
1fd50 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e  c_exit:.  return
1fd60 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1fd70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1fd80 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
1fd90 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  e the page ident
1fda0 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20 74  ified by pData t
1fdb0 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
1fdc0 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a  in the file. .**
1fdd0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
1fde0 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
1fdf0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
1fe00 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72  age pgno. If cur
1fe10 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e  rent page.** pgn
1fe20 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
1fe30 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1fe40 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
1fe50 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65 72  not written ther
1fe60 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20  e by.** by this 
1fe70 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d  routine. The sam
1fe80 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65  e applies to the
1fe90 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66 65   page pData refe
1fea0 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74  rs to on entry t
1feb0 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
1fec0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
1fed0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
1fee0 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70 44  refered to by pD
1fef0 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  ata remain valid
1ff00 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
1ff10 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
1ff20 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1ff30 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74   pData (i.e. dat
1ff40 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
1ff50 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
1ff60 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
1ff70 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
1ff80 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
1ff90 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
1ffa0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
1ffb0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1ffc0 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
1ffd0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1ffe0 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
1fff0 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
20000 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
20010 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
20020 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
20030 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
20040 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
20050 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
20060 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
20070 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
20080 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
20090 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
200a0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
200b0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
200c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
200d0 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
200e0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
200f0 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68  pPgOld; .  int h
20100 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e  ;.  Pgno needSyn
20110 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  cPgno = 0;..  as
20120 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
20130 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35 28 22  0 );..  TRACE5("
20140 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
20150 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
20160 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
20170 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
20180 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
20190 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
201a0 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45  pgno);.  IOTRACE
201b0 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
201c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
201d0 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
201e0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
201f0 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  ync ){.    needS
20200 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
20210 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
20220 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
20230 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20240 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  Pg->dirty );.   
20250 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20260 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
20270 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50  ..  /* Unlink pP
20280 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
20290 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69  -chain */.  unli
202a0 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
202b0 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  er, pPg);..  /* 
202c0 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
202d0 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
202e0 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
202f0 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
20300 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  ** from it's has
20310 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
20320 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
20330 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
20340 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
20350 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
20360 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
20370 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
20380 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
20390 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
203a0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
203b0 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
203c0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
203d0 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
203e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
203f0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  gOld->nRef==0 );
20400 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  .    unlinkHashC
20410 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
20420 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  Old);.    makeCl
20430 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20  ean(pPgOld);.   
20440 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65   if( pPgOld->nee
20450 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
20460 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69  ssert( pPgOld->i
20470 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
20480 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
20490 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 1;.      pPg-
204a0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
204b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
204c0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
204d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
204e0 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
204f0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
20500 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
20510 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d  to the new hash-
20520 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  chain. */.  asse
20530 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
20540 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
20550 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  o;.  h = pgno & 
20560 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
20570 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
20580 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20  >aHash[h] ){.   
20590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
205a0 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
205b0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Hash==0 );.    p
205c0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
205d0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
205e0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
205f0 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
20600 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61  >aHash[h];.  pPa
20610 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
20620 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  pPg;.  pPg->pPre
20630 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61  vHash = 0;..  ma
20640 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
20650 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
20660 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  he = 1;..  if( n
20670 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
20680 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
20690 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
206a0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
206b0 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
206c0 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
206d0 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
206e0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
206f0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
20700 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
20710 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
20720 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
20730 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
20740 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
20750 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67   the .    ** Pag
20760 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.aInJournal bi
20770 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  t has been set. 
20780 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
20790 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61   remedied by loa
207a0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ding.    ** the 
207b0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
207c0 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
207d0 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
207e0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20  needSync flag.. 
207f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
20800 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20810 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
20820 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
20830 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
20840 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
20850 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
20860 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
20870 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
20880 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  ;.    PgHdr *pPg
20890 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Hdr;.    assert(
208a0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
208b0 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
208c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
208d0 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
208e0 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20  no, &pPgHdr);.  
208f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20900 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
20910 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
20920 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  dSync = 1;.    p
20930 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20  PgHdr->needSync 
20940 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
20950 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
20960 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50      makeDirty(pP
20970 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
20980 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
20990 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Hdr);.  }..  ret
209a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
209b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
209c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
209d0 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
209e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
209f0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
20a00 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
20a10 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
20a20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
20a30 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
20a40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
20a50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
20a60 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
20a70 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
20a80 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
20a90 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
20aa0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
20ab0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
20ac0 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
20ad0 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
20ae0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
20af0 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
20b00 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f  n (pPager?PGHDR_
20b10 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
20b20 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 23 69 66  ager):0);.}..#if
20b30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
20b40 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
20b50 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
20b60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20b70 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
20b80 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
20b90 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
20ba0 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
20bb0 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
20bc0 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
20bd0 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
20be0 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
20bf0 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
20c00 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
20c10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
20c20 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
20c30 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
20c40 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
20c50 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
20c60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
20c70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
20c80 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
20c90 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
20ca0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
20cb0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
20cc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20cd0 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
20ce0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20cf0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
20d00 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
20d10 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
20d20 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
20d30 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
20d40 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
20d50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
20d60 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
20d70 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
20d80 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
20d90 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
20da0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
20db0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
20dc0 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
20dd0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
20de0 20 2a 2f 0a                                       */.