/ Hex Artifact Content
Login

Artifact e7b94954a489485e9bc2954810f8708f27dae27d:


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 33 36  : pager.c,v 1.36
0350: 30 20 32 30 30 37 2f 30 38 2f 31 38 20 31 30 3a  0 2007/08/18 10:
0360: 35 39 3a 32 30 20 64 61 6e 69 65 6c 6b 31 39 37  59:20 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 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a   sqlite3_file.**
0710: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
0720: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65  argument..*/.#de
0730: 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29 20  fine PAGERID(p) 
0740: 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23  ((int)(p->fd)).#
0750: 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c  define FILEHANDL
0760: 45 49 44 28 66 64 29 20 28 28 69 6e 74 29 66 64  EID(fd) ((int)fd
0770: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  )../*.** The pag
0780: 65 20 63 61 63 68 65 20 61 73 20 61 20 77 68 6f  e cache as a who
0790: 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  le is always in 
07a0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
07b0: 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a  wing.** states:.
07c0: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e  **.**   PAGER_UN
07d0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68 65 20  LOCK        The 
07e0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f  page cache is no
07f0: 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64  t currently read
0800: 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20  ing or .**      
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0830: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
0840: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20  re is no.**     
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d    data held in m
0870: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20  emory.  This is 
0880: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20  the initial.**  
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a       state..**.*
08b0: 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52 45 44  *   PAGER_SHARED
08c0: 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65          The page
08d0: 20 63 61 63 68 65 20 69 73 20 72 65 61 64 69 6e   cache is readin
08e0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
08f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0900: 20 20 20 20 20 20 20 20 20 57 72 69 74 69 6e 67           Writing
0910: 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
0920: 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20 62 65  d.  There can be
0930: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0940: 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70            multip
0950: 6c 65 20 72 65 61 64 65 72 73 20 61 63 63 65 73  le readers acces
0960: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
0970: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
09a0: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50   time..**.**   P
09b0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
09c0: 20 20 20 54 68 69 73 20 70 72 6f 63 65 73 73 20     This process 
09d0: 68 61 73 20 72 65 73 65 72 76 65 64 20 74 68 65  has reserved the
09e0: 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 72   database for wr
09f0: 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  iting.**        
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
0a10: 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d  ut has not yet m
0a20: 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e  ade any changes.
0a30: 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65    Only one proce
0a40: 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 20 61              at a
0a60: 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76   time can reserv
0a70: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
0a80: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   The original.**
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
0ab0: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
0ac0: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74  n modified so ot
0ad0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  her.**          
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0af0: 63 65 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c  cesses may still
0b00: 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
0b10: 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20  on-disk.**      
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
0b40: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58  **.**   PAGER_EX
0b50: 43 4c 55 53 49 56 45 20 20 20 20 20 54 68 65 20  CLUSIVE     The 
0b60: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 77 72  page cache is wr
0b70: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
0b80: 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 63 63               Acc
0ba0: 65 73 73 20 69 73 20 65 78 63 6c 75 73 69 76 65  ess is exclusive
0bb0: 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63  .  No other proc
0bc0: 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20  esses or.**     
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 74 68 72 65 61 64 73 20 63 61 6e 20 62 65    threads can be
0bf0: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
0c00: 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a  ing while one.**
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 20 69         process i
0c30: 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s writing..**.**
0c40: 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20     PAGER_SYNCED 
0c50: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 72         The pager
0c60: 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73   moves to this s
0c70: 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f  tate from PAGER_
0c80: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72     after all dir
0cb0: 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ty pages have be
0cc0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
0cd0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0ce0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0cf0: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
0d00: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
0d10: 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20  ynced to.**     
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74    disk. All that
0d40: 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69   remains to do i
0d50: 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a  s to remove or.*
0d60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0d70: 20 20 20 20 20 20 20 20 74 72 75 6e 63 61 74 65          truncate
0d80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
0d90: 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  e and the transa
0da0: 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
0dd0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  d..**.** The pag
0de0: 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70  e cache comes up
0df0: 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
0e00: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0e10: 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  e a.** sqlite3Pa
0e20: 67 65 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c  gerGet() occurs,
0e30: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e40: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0e50: 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72  SHARED..** After
0e60: 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
0e70: 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73  been released us
0e80: 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  ing sqlite_page_
0e90: 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20  unref(),.** the 
0ea0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0eb0: 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
0ec0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0ed0: 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20  st time.** that 
0ee0: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
0ef0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  e() is called, t
0f00: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0f10: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52  ions to.** PAGER
0f20: 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74  _RESERVED.  (Not
0f30: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61  e that sqlite3Pa
0f40: 67 65 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f  gerWrite() can o
0f50: 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64  nly be.** called
0f60: 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   on an outstandi
0f70: 6e 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65  ng page which me
0f80: 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
0f90: 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e  er must.** be in
0fa0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65   PAGER_SHARED be
0fb0: 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69  fore it transiti
0fc0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53  ons to PAGER_RES
0fd0: 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52  ERVED.).** PAGER
0fe0: 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20  _RESERVED means 
0ff0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 6e  that there is an
1000: 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   open rollback j
1010: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74  ournal..** The t
1020: 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47  ransition to PAG
1030: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63  ER_EXCLUSIVE occ
1040: 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63  urs before any c
1050: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
1060: 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
1070: 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20  se file, though 
1080: 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f  writes to the ro
1090: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
10a0: 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75  l occurs with ju
10b0: 73 74 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  st PAGER_RESERVE
10c0: 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c  D.  After an sql
10d0: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
10e0: 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65  k().** or sqlite
10f0: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1100: 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74  eTwo(), the stat
1110: 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f  e can go back to
1120: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a   PAGER_SHARED,.*
1130: 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79  * or it can stay
1140: 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53   at PAGER_EXCLUS
1150: 49 56 45 20 69 66 20 77 65 20 61 72 65 20 69 6e  IVE if we are in
1160: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
1170: 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69  s mode..*/.#defi
1180: 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  ne PAGER_UNLOCK 
1190: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50       0.#define P
11a0: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
11b0: 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   1   /* same as 
11c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SHARED_LOCK */.#
11d0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53  define PAGER_RES
11e0: 45 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20  ERVED    2   /* 
11f0: 73 61 6d 65 20 61 73 20 52 45 53 45 52 56 45 44  same as RESERVED
1200: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
1210: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1220: 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61     4   /* same a
1230: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
1240: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1250: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a  R_SYNCED      5.
1260: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  ./*.** If the SQ
1270: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1280: 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73  ED_LOCK macro is
1290: 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 74 20   set to true at 
12a0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a  compile-time,.**
12b0: 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74   then failed att
12c0: 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20 72  empts to get a r
12d0: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c  eserved lock wil
12e0: 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  l invoke the bus
12f0: 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54  y callback..** T
1300: 68 69 73 20 69 73 20 6f 66 66 20 62 79 20 64 65  his is off by de
1310: 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77  fault.  To see w
1320: 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  hy, consider the
1330: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
1340: 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70  rio:.** .** Supp
1350: 6f 73 65 20 74 68 72 65 61 64 20 41 20 61 6c 72  ose thread A alr
1360: 65 61 64 79 20 68 61 73 20 61 20 73 68 61 72 65  eady has a share
1370: 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73  d lock and wants
1380: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1390: 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c  ..** Thread B al
13a0: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 73 65  ready has a rese
13b0: 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  rved lock and wa
13c0: 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  nts an exclusive
13d0: 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f   lock.  If.** bo
13e0: 74 68 20 74 68 72 65 61 64 73 20 61 72 65 20 75  th threads are u
13f0: 73 69 6e 67 20 74 68 65 69 72 20 62 75 73 79 20  sing their busy 
1400: 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69  callbacks, it mi
1410: 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69  ght be a long ti
1420: 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65  me.** be for one
1430: 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 73 20   of the threads 
1440: 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f  give up and allo
1450: 77 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20  ws the other to 
1460: 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20  proceed..** But 
1470: 69 66 20 74 68 65 20 74 68 72 65 61 64 20 74 72  if the thread tr
1480: 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20  ying to get the 
1490: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69  reserved lock gi
14a0: 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a  ves up quickly.*
14b0: 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72 20 69  * (if it never i
14c0: 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20  nvokes its busy 
14d0: 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74  callback) then t
14e0: 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69  he contention wi
14f0: 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65  ll be.** resolve
1500: 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69  d quickly..*/.#i
1510: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53  fndef SQLITE_BUS
1520: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  Y_RESERVED_LOCK.
1530: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
1540: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1550: 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  CK 0.#endif../*.
1560: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f  ** This macro ro
1570: 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20 73  unds values up s
1580: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61  o that if the va
1590: 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72 65 73  lue is an addres
15a0: 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61  s it.** is guara
15b0: 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61  nteed to be an a
15c0: 64 64 72 65 73 73 20 74 68 61 74 20 69 73 20 61  ddress that is a
15d0: 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62  ligned to an 8-b
15e0: 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f  yte boundary..*/
15f0: 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41  .#define FORCE_A
1600: 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28  LIGNMENT(X)   ((
1610: 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a  (X)+7)&~7)../*.*
1620: 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  * Each in-memory
1630: 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65   image of a page
1640: 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65   begins with the
1650: 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65   following heade
1660: 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65  r..** This heade
1670: 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c  r is only visibl
1680: 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20  e to this pager 
1690: 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69  module.  The cli
16a0: 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74  ent.** code that
16b0: 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65   calls pager see
16c0: 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20  s only the data 
16d0: 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65  that follows the
16e0: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43   header..**.** C
16f0: 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c  lient code shoul
1700: 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  d call sqlite3Pa
1710: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20  gerWrite() on a 
1720: 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61  page prior to ma
1730: 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69  king.** any modi
1740: 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61  fications to tha
1750: 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  t page.  The fir
1760: 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50  st time sqlite3P
1770: 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69  agerWrite().** i
1780: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72  s called, the or
1790: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17a0: 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e  ents are written
17b0: 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61   into the rollba
17c0: 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ck.** journal an
17d0: 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61  d PgHdr.inJourna
17e0: 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64  l and PgHdr.need
17f0: 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c  Sync are set.  L
1800: 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68  ater, once.** th
1810: 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68  e journal page h
1820: 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20  as made it onto 
1830: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
1840: 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  , PgHdr.needSync
1850: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20  .** is cleared. 
1860: 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61   The modified pa
1870: 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69  ge cannot be wri
1880: 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
1890: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64  he original.** d
18a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
18b0: 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  il the journal p
18c0: 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79  ages has been sy
18d0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64  nced to disk and
18e0: 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65   the.** PgHdr.ne
18f0: 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20  edSync has been 
1900: 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  cleared..**.** T
1910: 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66  he PgHdr.dirty f
1920: 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20  lag is set when 
1930: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1940: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e  e() is called an
1950: 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20  d.** is cleared 
1960: 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70  again when the p
1970: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77  age content is w
1980: 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74  ritten back to t
1990: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64  he original.** d
19a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
19b0: 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69  .** Details of i
19c0: 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75  mportant structu
19d0: 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a  re elements:.**.
19e0: 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a  ** needSync.**.*
19f0: 2a 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73  *     If this is
1a00: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
1a10: 73 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  s that it is not
1a20: 20 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74   safe to write t
1a30: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
1a40: 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61  ontent to the da
1a50: 74 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74  tabase because t
1a60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74  he original cont
1a70: 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20  ent needed.**   
1a80: 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68    for rollback h
1a90: 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64  as not by synced
1aa0: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   to the main rol
1ab0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1ac0: 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e  *     The origin
1ad0: 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68  al content may h
1ae0: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1af0: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1b00: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1b10: 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79  but it has not y
1b20: 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  et been synced. 
1b30: 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72   So we cannot wr
1b40: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
1b50: 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  ase.**     file 
1b60: 62 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61  because power fa
1b70: 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73  ilure might caus
1b80: 65 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  e the page in th
1b90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1ba0: 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72  *     to never r
1bb0: 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20  each the disk.  
1bc0: 49 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20  It is as if the 
1bd0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
1be0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
1bf0: 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1c00: 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61  until the journa
1c10: 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1c20: 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20  ..**     .**    
1c30: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61   This flag is fa
1c40: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20  lse if the page 
1c50: 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20  content exactly 
1c60: 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20  matches what.** 
1c70: 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78      currently ex
1c80: 69 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ists in the data
1c90: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
1ca0: 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1cb0: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c   also.**     fal
1cc0: 73 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e  se if the origin
1cd0: 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  al content has b
1ce0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1cf0: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
1d00: 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
1d10: 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20  and synced.  If 
1d20: 74 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65  the page represe
1d30: 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74  nts a new page t
1d40: 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62  hat has.**     b
1d50: 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74  een added onto t
1d60: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1d70: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68  tabase during th
1d80: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20  e current.**    
1d90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1da0: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
1db0: 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68  is true until th
1dc0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
1dd0: 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20  ase.**     size 
1de0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  in the journal h
1df0: 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73  eader has been s
1e00: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
1e10: 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a  *.** inJournal.*
1e20: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73  *.**     This is
1e30: 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69   true if the ori
1e40: 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62  ginal page has b
1e50: 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  een written into
1e60: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20   the main.**    
1e70: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1e80: 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61  l.  This is alwa
1e90: 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77  ys false for new
1ea0: 20 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a   pages added to.
1eb0: 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f  **     the end o
1ec0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1ed0: 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ile during the c
1ee0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1ef0: 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74  on..**     And t
1f00: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f  his flag says no
1f10: 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74  thing about whet
1f20: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
1f30: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61  ournal.**     ha
1f40: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
1f50: 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65   disk.  For page
1f60: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
1f70: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
1f80: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c    database file,
1f90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
1fa0: 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64  xpression should
1fb0: 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a   always be true:
1fc0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a  .**.**       inJ
1fd0: 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
1fe0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28 70 67  ->aInJournal[(pg
1ff0: 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c 3c 28  no-1)/8] & (1<<(
2000: 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d 30 0a  (pgno-1)%8))!=0.
2010: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 70 50  **.**     The pP
2020: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
2030: 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e 6c 79  [] array is only
2040: 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6f   valid for the o
2050: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 70  riginal.**     p
2060: 61 67 65 73 20 6f 66 20 74 68 65 20 64 61 74 61  ages of the data
2070: 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20 70 61  base, not new pa
2080: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 64 64  ges that are add
2090: 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a  ed to the end.**
20a0: 20 20 20 20 20 6f 66 20 74 68 65 20 64 61 74 61       of the data
20b0: 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f 75 73  base, so obvious
20c0: 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65 78 70  ly the above exp
20d0: 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ression cannot b
20e0: 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64 20 66  e.**     valid f
20f0: 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20 20 46  or new pages.  F
2100: 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69 6e 4a  or new pages inJ
2110: 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73  ournal is always
2120: 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74 79 0a   0..**.** dirty.
2130: 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e 20 74  **.**     When t
2140: 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  rue, this means 
2150: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2160: 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61 73   of the page has
2170: 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d 6f 64   been.**     mod
2180: 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64 73 20  ified and needs 
2190: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 61  to be written ba
21a0: 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ck to the databa
21b0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  se file..**     
21c0: 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d 65 61  If false, it mea
21d0: 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 74  ns that either t
21e0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
21f0: 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20 20 20  e page is.**    
2200: 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20 65 6c   unchanged or el
2210: 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  se the content i
2220: 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20 61 6e  s unimportant an
2230: 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 20  d we do not.**  
2240: 20 20 20 63 61 72 65 20 77 68 65 74 68 65 72 20     care whether 
2250: 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70 72 65  or not it is pre
2260: 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c  served..**.** al
2270: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a  waysRollback.**.
2280: 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65 61 6e  **     This mean
2290: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
22a0: 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
22b0: 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75 6c 64  ack() API should
22c0: 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e 6f 72   be.**     ignor
22d0: 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
22e0: 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c 6c 62  .  The DontRollb
22f0: 61 63 6b 28 29 20 41 50 49 20 61 74 74 65 6d 70  ack() API attemp
2300: 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20 20 20  ts to say.**    
2310: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2320: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 6e  t of the page on
2330: 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70 6f 72   disk is unimpor
2340: 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e 0a 2a  tant (it is an.*
2350: 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70 61 67  *     unused pag
2360: 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  e on the freelis
2370: 74 29 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  t) so that it is
2380: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74 6f 20   unnecessary to 
2390: 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  .**     rollback
23a0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73   changes to this
23b0: 20 70 61 67 65 20 62 65 63 61 75 73 65 20 74 68   page because th
23c0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
23d0: 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 61 6e   page.**     can
23e0: 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75 74 20   change without 
23f0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d 65 61  changing the mea
2400: 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
2410: 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20  base.  This.**  
2420: 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69 64 65     flag override
2430: 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c 62 61  s any DontRollba
2440: 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20 20 54  ck() attempt.  T
2450: 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a  his flag is set.
2460: 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20 70 61  **     when a pa
2470: 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  ge that original
2480: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c  ly contained val
2490: 69 64 20 64 61 74 61 20 69 73 20 61 64 64 65 64  id data is added
24a0: 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 66   to.**     the f
24b0: 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65 72 20  reelist.  Later 
24c0: 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  in the same tran
24d0: 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 70 61  saction, this pa
24e0: 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 20  ge might.**     
24f0: 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74  be pulled from t
2500: 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
2510: 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 74  reused for somet
2520: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
2530: 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74 68 61  *     and at tha
2540: 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f 6e 74  t point the Dont
2550: 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 77  Rollback() API w
2560: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
2570: 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70 61 67  cause.**     pag
2580: 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  es taken from th
2590: 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20 6e 6f  e freelist do no
25a0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 72 6f  t need to be pro
25b0: 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20 20 20  tected by.**    
25c0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
25d0: 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68 69 73  urnal.  But this
25e0: 20 66 6c 61 67 20 73 61 79 73 20 74 68 61 74 20   flag says that 
25f0: 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20  the page was.** 
2600: 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c      not original
2610: 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ly part of the f
2620: 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61 74 20  reelist so that 
2630: 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73 20 74  it still needs t
2640: 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f 6c 6c  o.**     be roll
2650: 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
2660: 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71 75 65   of any subseque
2670: 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  nt DontRollback(
2680: 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e  ) calls..**.** n
2690: 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a 20 20  eedRead .**.**  
26a0: 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d 65 61     This flag mea
26b0: 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29 20 74  ns (when true) t
26c0: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
26d0: 6f 66 20 74 68 65 20 70 61 67 65 20 68 61 73 0a  of the page has.
26e0: 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74 20 62  **     not yet b
26f0: 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20  een loaded from 
2700: 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d 6d 65  disk.  The in-me
2710: 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69 73 20  mory content is 
2720: 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61 72 62  just.**     garb
2730: 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c 79 2c  age.  (Actually,
2740: 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63 6f 6e   we zero the con
2750: 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20 73 68  tent, but you sh
2760: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
2770: 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d 70 74  make any assumpt
2780: 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65 20 63  ions about the c
2790: 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68 65 6c  ontent neverthel
27a0: 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a  ess.)  If the.**
27b0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69 73 20       content is 
27c0: 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20 66 75  needed in the fu
27d0: 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c 64 20  ture, it should 
27e0: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
27f0: 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e 61 6c  .**     original
2800: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2810: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2820: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
2830: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
2840: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2860: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
2870: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
2880: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
2890: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
28a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
28b0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
28c0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
28d0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
28e0: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
28f0: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
2900: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
2910: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
2920: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
2930: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
2940: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
2950: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
2960: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
2970: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2980: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
2990: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
29a0: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c0: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
29d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
29e0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
29f0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
2a10: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
2a20: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
2a30: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2a40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a50: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
2a60: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
2a70: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
2a80: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
2a90: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
2aa0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
2ab0: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
2ac0: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2ad0: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2af0: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
2b00: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
2b10: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
2b20: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b40: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
2b50: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
2b60: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
2b70: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
2b80: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
2b90: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
2bc0: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
2bd0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
2be0: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
2bf0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
2c00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
2c10: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
2c20: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
2c30: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
2c40: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
2c50: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
2c60: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
2c70: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
2c80: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
2c90: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
2ca0: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
2cb0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2cc0: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
2cd0: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
2ce0: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
2cf0: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
2d00: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
2d10: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
2d20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
2d30: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
2d40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2d50: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
2d60: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
2d70: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
2d80: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
2d90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
2da0: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
2db0: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
2dc0: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
2dd0: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
2de0: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
2df0: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
2e00: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
2e10: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
2e20: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
2e30: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
2e40: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
2e50: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
2e60: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2e70: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2e80: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2e90: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2ea0: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2eb0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2ec0: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2ed0: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2ee0: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2ef0: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2f00: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
2f10: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
2f20: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
2f30: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
2f40: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
2f50: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
2f60: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2f70: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2f80: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2f90: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2fa0: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2fb0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2fc0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2fd0: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
3000: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
3010: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
3020: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
3030: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
3040: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
3050: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
3060: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
3070: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
3080: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
3090: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
30a0: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
30b0: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
30c0: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
30d0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
30e0: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
30f0: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
3100: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
3110: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
3120: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
3130: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
3140: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
3150: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
3160: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
3170: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
3180: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
3190: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
31a0: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
31b0: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
31c0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
31d0: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
31e0: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
31f0: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
3200: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
3210: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
3220: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
3230: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
3240: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
3250: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
3260: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
3270: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
3280: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
3290: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
32a0: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
32b0: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
32c0: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
32d0: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
32e0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
32f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3300: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3310: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
3320: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
3330: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
3340: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
3350: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
3360: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
3370: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
3380: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
3390: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
33a0: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
33b0: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
33c0: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
33d0: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
33e0: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
33f0: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
3400: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
3410: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
3420: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
3430: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
3440: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
3450: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
3460: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
3470: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
3480: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
3490: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
34a0: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
34b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
34c0: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
34d0: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
34e0: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
34f0: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
3500: 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger {.  sqlite3_
3510: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
3520: 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69      /* OS functi
3530: 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49  ons to use for I
3540: 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  O */.  u8 journa
3550: 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  lOpen;          
3560: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
3570: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
3580: 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20  iptors is valid 
3590: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
35a0: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
35b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
35c0: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
35d0: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
35e0: 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  useJournal;     
35f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
3600: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
3610: 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  al on this file 
3620: 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f  */.  u8 noReadlo
3630: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
3640: 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
3650: 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64  r to obtain read
3660: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74  locks */.  u8 st
3670: 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  mtOpen;         
3680: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3690: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
36a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  subjournal is op
36b0: 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49  en */.  u8 stmtI
36c0: 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  nUse;           
36d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61      /* True we a
36e0: 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e  re in a statemen
36f0: 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
3700: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74   */.  u8 stmtAut
3710: 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  oopen;          
3720: 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a    /* Open stmt j
3730: 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e  ournal when main
3740: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
3750: 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  ed*/.  u8 noSync
3760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3770: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
3780: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
3790: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
37a0: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
37b0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
37c0: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
37d0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
37e0: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 66  stness */.  u8 f
37f0: 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20 20  ull_fsync;      
3800: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 46          /* Use F
3810: 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20  _FULLFSYNC when 
3820: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75  available */.  u
3830: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
3850: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
3860: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
3870: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d  etc. */.  u8 tem
3880: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3890: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
38a0: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
38b0: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
38c0: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
38d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
38e0: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
38f0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3900: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
3910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3920: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
3930: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
3940: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
3950: 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20   dirtyCache;    
3960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3970: 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65  e if cached page
3980: 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a  s have changed *
3990: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
39a0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
39b0: 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52  /* Disable DontR
39c0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
39d0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
39e0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3a00: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
3a10: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
3a20: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
3a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3a40: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
3a50: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
3a60: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
3a70: 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20   doNotSync;     
3a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
3a90: 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65  lean. While true
3aa0: 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  , do not spill t
3ab0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38  he cache */.  u8
3ac0: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
3ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
3ae0: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
3af0: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
3b00: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63 68  USIVE */.  u8 ch
3b10: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
3b20: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
3b30: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
3b40: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
3b50: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ter */.  int err
3b60: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
3b70: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
3b80: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
3b90: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
3ba0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
3bb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3bc0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
3bd0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
3be0: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
3bf0: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
3c00: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
3c10: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
3c20: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c40: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
3c50: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
3c60: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
3c70: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c90: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
3cb0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
3cc0: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
3cd0: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
3ce0: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
3cf0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
3d00: 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73  cksum */.  int s
3d10: 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20  tmtNRec;        
3d20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3d30: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73   of records in s
3d40: 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  tmt subjournal *
3d50: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20  /.  int nExtra; 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
3d80: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
3d90: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
3da0: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3dc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
3dd0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
3de0: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e00: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
3e10: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
3e20: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
3e50: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
3e60: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
3e70: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
3ea0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
3eb0: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
3ec0: 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20    Pgno mxPgno;  
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
3ef0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
3f00: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a 61  abase */.  u8 *a
3f10: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
3f20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
3f30: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
3f40: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3f50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  file */.  u8 *aI
3f60: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
3f70: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
3f80: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
3f90: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
3fa0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
3fb0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3fc0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
3fd0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
3fe0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
3ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4000: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
4010: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
4020: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
4030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
4040: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
4050: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
4060: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c  l files */.  sql
4070: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a  ite3_file *fd, *
4080: 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65  jfd;     /* File
4090: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
40a0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
40b0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74  urnal */.  sqlit
40c0: 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20  e3_file *stfd;  
40d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
40e0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
40f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
4100: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
4110: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
4120: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
4130: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
4140: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48  Handler */.  PgH
4150: 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61  dr *pFirst, *pLa
4160: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
4170: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
4180: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
4190: 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  tSynced;        
41a0: 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61  /* First free pa
41b0: 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65  ge with PgHdr.ne
41c0: 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50  edSync==0 */.  P
41d0: 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20  gHdr *pAll;     
41e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
41f0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
4200: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d  */.  PgHdr *pStm
4210: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4220: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
4230: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
4240: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
4250: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
4260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4270: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69  * List of all di
4280: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  rty pages */.  i
4290: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
42a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
42b0: 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65  rrent byte offse
42c0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
42d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
42e0: 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20  ournalHdr;      
42f0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
4300: 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75  ffset to previou
4310: 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  s journal header
4320: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64   */.  i64 stmtHd
4330: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
4340: 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e    /* First journ
4350: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
4360: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
4370: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b   */.  i64 stmtCk
4380: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
4390: 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77    /* cksumInit w
43a0: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61  hen statement wa
43b0: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  s started */.  i
43c0: 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20  64 stmtJSize;   
43d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
43e0: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
43f0: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
4400: 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a  .  int sectorSiz
4410: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
4420: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
4430: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
4440: 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20  lback */.#ifdef 
4450: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
4460: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
4470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
4480: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
4490: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
44a0: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
44b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
44c0: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
44d0: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
44e0: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
44f0: 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  or)(DbPage*,int)
4500: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
4510: 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65  outine when free
4520: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76  ing pages */.  v
4530: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
4540: 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20  (DbPage*,int);  
4550: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4560: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4570: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4580: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4590: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
45a0: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
45b0: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
45c0: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
45d0: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
45e0: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
45f0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
4600: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
4610: 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f  t to xCodec() */
4620: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48  .#endif.  int nH
4630: 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
4640: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
4650: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20   the pager hash 
4660: 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72  table */.  PgHdr
4670: 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20   **aHash;       
4680: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
4690: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
46a0: 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72   number to PgHdr
46b0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
46c0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
46d0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67  MANAGEMENT.  Pag
46e0: 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  er *pNext;      
46f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
4700: 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
4710: 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64  s in this thread
4720: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4730: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4740: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4750: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4760: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4770: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
4780: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
4790: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
47a0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
47b0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
47c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
47d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
47e0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
47f0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
4800: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
4810: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
4820: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
4830: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
4840: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
4850: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
4860: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
4870: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
4880: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4890: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
48a0: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
48b0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
48c0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
48d0: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
48e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
48f0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
4900: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
4910: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4920: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
4930: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4940: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
4950: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4960: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
4970: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
4980: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4990: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
49a0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
49b0: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
49c0: 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65 66  s freed */.# def
49d0: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
49e0: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
49f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
4a00: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  (v).#endif..../*
4a10: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
4a20: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
4a30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
4a40: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
4a50: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
4a60: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
4a70: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
4a80: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
4a90: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
4aa0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
4ab0: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
4ac0: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
4ad0: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
4ae0: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
4af0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
4b00: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
4b10: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
4b20: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
4b30: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
4b40: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
4b50: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
4b60: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
4b70: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
4b80: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
4b90: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
4ba0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
4bb0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
4bc0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
4bd0: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
4be0: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
4bf0: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
4c00: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
4c10: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
4c20: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
4c30: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
4c40: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
4c50: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
4c60: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
4c70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
4c80: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
4c90: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
4ca0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
4cb0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
4cc0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
4cd0: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
4ce0: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
4cf0: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
4d00: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
4d10: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
4d20: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
4d30: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
4d40: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
4d50: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
4d60: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
4d70: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
4d80: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
4d90: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
4da0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
4db0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
4dc0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
4dd0: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
4de0: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
4df0: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
4e00: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
4e10: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
4e20: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
4e30: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
4e40: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
4e50: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
4e60: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
4e70: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
4e80: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
4e90: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
4ea0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
4eb0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
4ec0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
4ed0: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
4ee0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
4ef0: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
4f00: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
4f10: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
4f20: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
4f30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
4f40: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
4f50: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
4f60: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
4f70: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
4f80: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
4f90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
4fa0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
4fb0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
4fc0: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
4fd0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
4fe0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
4ff0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5000: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
5010: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
5020: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
5030: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
5040: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
5050: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
5060: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
5070: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
5080: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
5090: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
50a0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
50b0: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
50c0: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
50d0: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
50e0: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
50f0: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
5100: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5110: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5120: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5130: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
5140: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
5150: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
5160: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
5170: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
5180: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
5190: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
51a0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
51b0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
51c0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
51d0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
51e0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
51f0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5200: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5210: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5220: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5230: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
5240: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5250: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
5260: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
5270: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
5280: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
5290: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
52a0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
52b0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
52c0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
52d0: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
52e0: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
52f0: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
5300: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
5310: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
5320: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
5330: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
5340: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
5350: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
5360: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
5370: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
5380: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
5390: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
53a0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
53b0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
53c0: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
53d0: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
53e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
53f0: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
5400: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
5410: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
5420: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
5430: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
5440: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5450: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
5460: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5470: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
5480: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5490: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
54a0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
54b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
54c0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
54d0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
54e0: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
54f0: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
5500: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
5510: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
5520: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
5530: 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f  t pager3_refinfo
5540: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
5550: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
5560: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
5570: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
5580: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
5590: 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69  if( !pager3_refi
55a0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74  nfo_enable ) ret
55b0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
55c0: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
55d0: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
55e0: 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d   addr=%p nRef=%-
55f0: 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a  3d total=%d\n",.
5600: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
5610: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
5620: 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50  , p->nRef, p->pP
5630: 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29  ager->nRef.    )
5640: 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f  ;.    cnt++;   /
5650: 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73  * Something to s
5660: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
5670: 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69  on */.  }.# defi
5680: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70  ne REFINFO(X)  p
5690: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a  ager_refinfo(X).
56a0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52  #else.# define R
56b0: 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66  EFINFO(X).#endif
56c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
56d0: 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50 67  rue if page *pPg
56e0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
56f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
5700: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f   statement.** jo
5710: 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d  urnal (or statem
5720: 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73  ent snapshot has
5730: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
5740: 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a  f *pPg is part.*
5750: 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  * of an in-memor
5760: 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  y database)..*/.
5770: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
5780: 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72  nStatement(PgHdr
5790: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
57a0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
57b0: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d  Pager;.  if( MEM
57c0: 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  DB ){.    return
57d0: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
57e0: 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e 53  Pg, pPager)->inS
57f0: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
5800: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
5810: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 38 20  g->pgno;.    u8 
5820: 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61 49 6e  *a = pPager->aIn
5830: 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75 72 6e  Stmt;.    return
5840: 20 28 61 20 26 26 20 28 69 6e 74 29 70 67 6e 6f   (a && (int)pgno
5850: 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
5860: 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f 38 5d  ze && (a[pgno/8]
5870: 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
5880: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
5890: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
58a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
58b0: 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20  sh table to N.  
58c0: 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  N must be a powe
58d0: 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a  r.** of two..*/.
58e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
58f0: 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61  r_resize_hash_ta
5900: 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ble(Pager *pPage
5910: 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48  r, int N){.  PgH
5920: 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67  dr **aHash, *pPg
5930: 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20  ;.  assert( N>0 
5940: 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20  && (N&(N-1))==0 
5950: 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c  );.  aHash = sql
5960: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
5970: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
5980: 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73  *N );.  if( aHas
5990: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
59a0: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
59b0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
59c0: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
59d0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
59e0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
59f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
5a00: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
5a10: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
5a20: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
5a30: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
5a40: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
5a50: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
5a60: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
5a70: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
5a80: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
5a90: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
5aa0: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
5ab0: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
5ac0: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
5ad0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
5ae0: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
5af0: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
5b00: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
5b10: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
5b20: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
5b30: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
5b40: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
5b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
5b60: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
5b70: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
5b80: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
5b90: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
5ba0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
5bb0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
5bc0: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
5bd0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
5be0: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
5bf0: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
5c00: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
5c10: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
5c20: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
5c30: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
5c40: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
5c50: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
5c60: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
5c70: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
5c80: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
5c90: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
5ca0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
5cb0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
5cc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5cd0: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
5ce0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
5cf0: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
5d00: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
5d10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5d20: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
5d30: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
5d40: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
5d50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
5d60: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
5d70: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
5d80: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
5d90: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
5da0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
5db0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
5dc0: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
5dd0: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
5de0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5df0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
5e00: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
5e10: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
5e20: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
5e30: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
5e40: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
5e50: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
5e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5e70: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
5e80: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
5e90: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
5ea0: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5eb0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5ec0: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5ed0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5ee0: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
5ef0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5f00: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
5f10: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
5f20: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
5f30: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
5f40: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
5f50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
5f60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
5f70: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
5f80: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
5f90: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
5fa0: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
5fb0: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
5fc0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
5fd0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
5fe0: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
5ff0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
6000: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
6010: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
6020: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
6030: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
6040: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
6050: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
6060: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
6070: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
6080: 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65 71  tent. All subseq
6090: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
60a0: 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a 20  n this Pager.** 
60b0: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
60c0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
60d0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
60e0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
60f0: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
6100: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
6110: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
6120: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
6130: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
6140: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
6150: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
6160: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
6170: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
6180: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
6190: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
61a0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
61b0: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
61c0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
61d0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
61e0: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
61f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
6200: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
6210: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
6220: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6230: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
6240: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
6250: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
6260: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
6270: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
6280: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
6290: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
62a0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
62b0: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
62c0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
62d0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
62e0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
62f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
6300: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
6310: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
6320: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
6330: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
6340: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
6350: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
6360: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
6370: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
6380: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
6390: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
63a0: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
63b0: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
63c0: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
63d0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
63e0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
63f0: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
6400: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
6410: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
6420: 67 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20  geSize, .       
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
6450: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
6460: 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPage));.}../*.*
6470: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
6480: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
6490: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
64a0: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
64b0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
64c0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
64d0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
64e0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
64f0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
6500: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
6510: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
6520: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
6530: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
6540: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
6550: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
6560: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
6570: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
6580: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
6590: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
65a0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
65b0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
65c0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
65d0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
65e0: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
65f0: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
6600: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
6610: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
6620: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
6630: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
6640: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
6650: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
6660: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
6670: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
6680: 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(x).#endif../*.
6690: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
66a0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
66b0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
66c0: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
66d0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61   open..** The ma
66e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
66f0: 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66  e name is read f
6700: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
6710: 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  he file and .** 
6720: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
6730: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
6740: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
6750: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
6760: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
6770: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
6780: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
6790: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
67a0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
67b0: 33 5f 66 72 65 65 28 29 20 2a 70 7a 4d 61 73 74  3_free() *pzMast
67c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  er..**.** If no 
67d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
67e0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
67f0: 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  ent *pzMaster is
6800: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
6810: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
6820: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
6830: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
6840: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
6850: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
6860: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
6870: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
6880: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
6890: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
68a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
68b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
68c0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
68d0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
68e0: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
68f0: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
6900: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
6910: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
6920: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6930: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
6940: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6950: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
6960: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
6970: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6980: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
6990: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
69a0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
69b0: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  J-12, &cksum);. 
69c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
69d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
69e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
69f0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
6a00: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a  gic, 8, szJ-8);.
6a10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6a20: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
6a30: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
6a40: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
6a50: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
6a60: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
6a70: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6c 65  te3MallocZero(le
6a80: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
6a90: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
6aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6ab0: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
6ac0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
6ad0: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
6ae0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  n, szJ-16-len);.
6af0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
6b10: 65 33 5f 66 72 65 65 28 2a 70 7a 4d 61 73 74 65  e3_free(*pzMaste
6b20: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
6b30: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
6b40: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
6b50: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
6b60: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
6b70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6b80: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
6b90: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
6ba0: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
6bb0: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
6bc0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
6bd0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
6be0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
6bf0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
6c00: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
6c10: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
6c20: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
6c30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6c40: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
6c50: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
6c60: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
6c70: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
6c80: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
6c90: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
6ca0: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
6cb0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
6cc0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
6cd0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  /.    sqlite3_fr
6ce0: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
6cf0: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
6d00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
6d10: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
6d20: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
6d30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6d40: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
6d50: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
6d60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
6d70: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
6d80: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
6d90: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
6da0: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
6db0: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
6dc0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
6dd0: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
6de0: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
6df0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
6e00: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
6e10: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
6e20: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
6e30: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
6e40: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6e90: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6eb0: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
6ed0: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
6f00: 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72  ic void seekJour
6f10: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
6f20: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
6f30: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
6f40: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6f50: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
6f60: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
6f70: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
6f80: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
6f90: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
6fa0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
6fb0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6fc0: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
6fd0: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
6fe0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
6ff0: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
7000: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
7010: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7020: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
7030: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
7040: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
7050: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
7060: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
7070: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7080: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
7090: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
70a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
70b0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
70c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
70d0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
70e0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
70f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
7100: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
7110: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
7120: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
7130: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
7140: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
7150: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
7160: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
7170: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
7180: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
7190: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
71a0: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
71b0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
71c0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
71d0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
71e0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
71f0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
7200: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
7210: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
7220: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
7230: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
7240: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
7250: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
7260: 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20   - 24) bytes of 
7270: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
7280: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
7290: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
72a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68  r *pPager){.  ch
72b0: 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  ar zHeader[sizeo
72c0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
72d0: 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  +16];.  int rc;.
72e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
72f0: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
7300: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
7310: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
7320: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d  >journalOff;.  }
7330: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
7340: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  dr(pPager);.  pP
7350: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
7360: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7370: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 46 49 58  alOff;..  /* FIX
7380: 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ME: .  **.  ** 
7390: 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70  Possibly for a p
73a0: 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  ager not in no-s
73b0: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
73c0: 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75  urnal magic shou
73d0: 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77  ld not.  ** be w
73e0: 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65  ritten until nRe
73f0: 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61  c is filled in a
7400: 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73  s part of next s
7410: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20  yncJournal(). . 
7420: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
7430: 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c  y maybe the whol
7440: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7450: 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79   should be delay
7460: 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20  ed until that.  
7470: 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20  ** point. Think 
7480: 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f  about this..  */
7490: 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65  .  memcpy(zHeade
74a0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
74b0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
74c0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54  lMagic));.  /* T
74d0: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30  he nRec Field. 0
74e0: 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f  xFFFFFFFF for no
74f0: 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20  -sync journals. 
7500: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
7510: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7520: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
7530: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
7540: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29   0xffffffff : 0)
7550: 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ;.  /* The rando
7560: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
7570: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
7580: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
7590: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
75a0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
75b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
75c0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
75d0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
75e0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
75f0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
7600: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
7610: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
7620: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7630: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7640: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7650: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  +8], pPager->dbS
7660: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
7670: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7680: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
7690: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
76a0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
76b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
76c0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
76d0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f  ectorSize);.  IO
76e0: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
76f0: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
7700: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
7710: 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  nalHdr, sizeof(z
7720: 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d  Header))).  rc =
7730: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
7740: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
7750: 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
7760: 61 64 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f  ader),pPager->jo
7770: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61  urnalOff);.  pPa
7780: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
7790: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
77a0: 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  Z(pPager);..  /*
77b0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
77c0: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
77d0: 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  tten successfull
77e0: 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  y. Seek the jour
77f0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65  nal.  ** file de
7800: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
7810: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
7820: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
7830: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
7840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7850: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49    IOTRACE(("JTAI
7860: 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  L %p %lld\n", pP
7870: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
7880: 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20  urnalOff-1)).   
7890: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
78a0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
78b0: 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20 70 50 61  , "\000", 1, pPa
78c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
78d0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
78e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
78f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
7900: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
7910: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
7920: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
7930: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
7940: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
7950: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
7960: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
7970: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
7980: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
7990: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
79a0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
79b0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
79c0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
79d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
79e0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
79f0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
7a00: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
7a10: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
7a20: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7a30: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
7a40: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
7a50: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
7a60: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
7a70: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
7a80: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
7a90: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
7aa0: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
7ab0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
7ac0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
7ad0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
7ae0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
7af0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
7b00: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
7b10: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
7b20: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
7b30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
7b40: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
7b50: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
7b60: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
7b70: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
7b80: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
7b90: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
7ba0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
7bb0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
7bc0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
7bd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7be0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
7bf0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
7c00: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
7c10: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
7c20: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
7c30: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
7c40: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
7c50: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
7c60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
7c70: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
7c80: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
7c90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
7ca0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
7cb0: 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20 73  64 jrnlOff;..  s
7cc0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
7cd0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
7ce0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
7cf0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7d00: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
7d10: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
7d20: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
7d30: 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20    }.  jrnlOff = 
7d40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7d50: 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ff;..  rc = sqli
7d60: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
7d70: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
7d80: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a  izeof(aMagic), j
7d90: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
7da0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
7db0: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65   jrnlOff += size
7dc0: 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69  of(aMagic);..  i
7dd0: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
7de0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7df0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
7e00: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
7e10: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
7e20: 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33   }..  rc = read3
7e30: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7e40: 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65  d, jrnlOff, pNRe
7e50: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
7e60: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
7e70: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
7e80: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
7e90: 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  f+4, &pPager->ck
7ea0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
7eb0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7ec0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7ed0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7ee0: 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69  jrnlOff+8, pDbSi
7ef0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
7f00: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
7f10: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
7f20: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
7f30: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
7f40: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
7f50: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
7f60: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
7f70: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
7f80: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
7f90: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
7fa0: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
7fb0: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
7fc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
7fd0: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
7fe0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
7ff0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
8000: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
8010: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
8020: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
8030: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
8040: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
8050: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
8060: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
8070: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c  jfd, jrnlOff+12,
8080: 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d   (u32 *)&pPager-
8090: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
80a0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
80b0: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
80c0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
80d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
80e0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
80f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
8100: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
8110: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
8120: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
8130: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8140: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
8150: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
8160: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
8170: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8180: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
8190: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
81a0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
81b0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
81c0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
81d0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
81e0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
81f0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
8200: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
8210: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
8220: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
8230: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
8240: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
8250: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
8260: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
8270: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
8280: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
8290: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
82a0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
82b0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
82c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
82d0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
82e0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
82f0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
8300: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
8310: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
8320: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
8330: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
8340: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
8350: 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  l name..**.** If
8360: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
8370: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
8380: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
8390: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
83a0: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
83b0: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
83c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
83d0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
83e0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
83f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
8400: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
8410: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
8420: 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e  nt i; .  i64 jrn
8430: 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73 75  lOff;.  u32 cksu
8440: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
8450: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
8460: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
8470: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
8480: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
8490: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
84a0: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
84b0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
84c0: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
84d0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
84e0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
84f0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
8500: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
8510: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
8520: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
8530: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
8540: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
8550: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
8560: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8570: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
8580: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
8590: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
85a0: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
85b0: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
85c0: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
85d0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
85e0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
85f0: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
8600: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
8610: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
8620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
8630: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8640: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
8650: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
8660: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
8670: 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f   jrnlOff, PAGER_
8680: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
8690: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
86a0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
86b0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
86c0: 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  4;..  rc = sqlit
86d0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
86e0: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
86f0: 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  len, jrnlOff);. 
8700: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8710: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8720: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e    jrnlOff += len
8730: 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a  ;..  put32bits(z
8740: 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74  Buf, len);.  put
8750: 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c  32bits(&zBuf[4],
8760: 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70   cksum);.  memcp
8770: 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75  y(&zBuf[8], aJou
8780: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
8790: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
87a0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
87b0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
87c0: 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69  >jfd, zBuf, 8+si
87d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
87e0: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
87f0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
8800: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
8810: 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ync;.  return rc
8820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
8830: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
8840: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
8850: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
8860: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
8870: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
8880: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
8890: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
88a0: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
88b0: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
88c0: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
88d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
88e0: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
88f0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
8900: 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  Commit().** rout
8910: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
8920: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
8930: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
8940: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
8950: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
8960: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
8970: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
8980: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
8990: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
89a0: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
89b0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
89c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
89d0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
89e0: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
89f0: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
8a00: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
8a10: 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29   assert( MEMDB )
8a20: 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e  ;.  if( !pHist->
8a30: 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  inStmt ){.    as
8a40: 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72  sert( pHist->pPr
8a50: 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69  evStmt==0 && pHi
8a60: 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  st->pNextStmt==0
8a70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
8a80: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
8a90: 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54     PGHDR_TO_HIST
8aa0: 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20  (pPager->pStmt, 
8ab0: 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74  pPager)->pPrevSt
8ac0: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  mt = pPg;.    }.
8ad0: 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74      pHist->pNext
8ae0: 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Stmt = pPager->p
8af0: 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Stmt;.    pPager
8b00: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  ->pStmt = pPg;. 
8b10: 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
8b20: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
8b30: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
8b40: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
8b50: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
8b60: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
8b70: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
8b80: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
8b90: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
8ba0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
8bb0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
8bc0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
8bd0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
8be0: 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  *p;.  if( pPager
8bf0: 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74  ->aHash==0 ) ret
8c00: 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61  urn 0;.  p = pPa
8c10: 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20  ger->aHash[pgno 
8c20: 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
8c30: 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  -1)];.  while( p
8c40: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
8c50: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
8c60: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
8c70: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
8c80: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
8c90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
8ca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8cb0: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
8cc0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
8cd0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
8ce0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  veMode ){.    if
8cf0: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
8d00: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
8d10: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
8d20: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50  _LOCK);.      pP
8d30: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
8d40: 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  1;.      IOTRACE
8d50: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
8d60: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a   pPager)).    }.
8d70: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
8d80: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
8d90: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
8da0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
8db0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
8dc0: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
8dd0: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
8de0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
8df0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
8e00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
8e10: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
8e20: 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  if the pager has
8e30: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
8e40: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74  .** the error-st
8e50: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
8e60: 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  oid pagerUnlockA
8e70: 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  ndRollback(Pager
8e80: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65   *p){.  if( p->e
8e90: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
8ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74  .  assert( p->st
8eb0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
8ec0: 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61  VED || p->journa
8ed0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66  lOpen==0 );.  if
8ee0: 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ( p->state>=PAGE
8ef0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
8f00: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
8f10: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20  llback(p);.  }. 
8f20: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29   pager_unlock(p)
8f30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
8f40: 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f  rrCode || !p->jo
8f50: 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d  urnalOpen || (p-
8f60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26  >exclusiveMode&&
8f70: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  !p->journalOff) 
8f80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8f90: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73  errCode || !p->s
8fa0: 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78  tmtOpen || p->ex
8fb0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d  clusiveMode );.}
8fc0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  .../*.** Clear t
8fd0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
8fe0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
8ff0: 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74  e.** sets the st
9000: 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
9010: 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74   back to what it
9020: 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73   was when it was
9030: 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64   first.** opened
9040: 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69  .  Any outstandi
9050: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
9060: 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62  alidated and sub
9070: 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73  sequent attempts
9080: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
9090: 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c  ose pages will l
90a0: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
90b0: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73  a coredump..*/.s
90c0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
90d0: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
90e0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
90f0: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  pPg, *pNext;.  i
9100: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
9110: 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  de ) return;.  f
9120: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
9130: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
9140: 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ext){.    IOTRAC
9150: 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
9160: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
9170: 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41  ->pgno));.    PA
9180: 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
9190: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
91a0: 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20  unt);.    pNext 
91b0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
91c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
91d0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50  e(pPg);.  }.  pP
91e0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
91f0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
9200: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
9210: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
9220: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
9230: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
9240: 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  ->pAll = 0;.  pP
9250: 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b  ager->nHash = 0;
9260: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9270: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
9280: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
9290: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
92a0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67  Hash = 0;.  pPag
92b0: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a  er->nRef = 0;.}.
92c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
92d0: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
92e0: 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73  action.  A trans
92f0: 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
9300: 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43  by either.** a C
9310: 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
9320: 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ACK..**.** When 
9330: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9340: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
9350: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
9360: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
9370: 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ** a RESERVED or
9380: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
9390: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
93a0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
93b0: 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  ill release.** t
93c0: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
93d0: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
93e0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
93f0: 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74  ts place if that
9400: 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f   is.** the appro
9410: 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20  priate thing to 
9420: 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63  do.  Release loc
9430: 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70  ks usually is ap
9440: 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e  propriate,.** un
9450: 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65  less we are in e
9460: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
9470: 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74  mode or unless t
9480: 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d  his is a .** COM
9490: 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72  MIT AND BEGIN or
94a0: 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45   ROLLBACK AND BE
94b0: 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  GIN operation..*
94c0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
94d0: 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20   file is either 
94e0: 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63  deleted or trunc
94f0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  ated..**.** TODO
9500: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
9510: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
9520: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
9530: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
9540: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
9550: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
9560: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
9570: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
9580: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
9590: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
95a0: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
95b0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
95c0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
95d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
95e0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
95f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9600: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d  _OK;.  int rc2 =
9610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
9620: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9630: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
9640: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
9650: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
9660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9670: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
9680: 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
9690: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
96a0: 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61  stmtOpen && !pPa
96b0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
96c0: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
96d0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
96e0: 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >stfd);.    pPag
96f0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
9700: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
9710: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
9720: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
9730: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
9740: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
9750: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
9760: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
9770: 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f  fd, 0))==SQLITE_
9780: 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70 50 61  OK ){;.      pPa
9790: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
97a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
97b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
97c0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
97d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
97e0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
97f0: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
9800: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
9810: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
9820: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9830: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9840: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
9850: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
9860: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
9870: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9880: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20    sqlite3_free( 
9890: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
98a0: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
98b0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
98c0: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
98d0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
98e0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
98f0: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
9900: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
9910: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
9920: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
9930: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
9940: 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52      pPg->alwaysR
9950: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66  ollback = 0;.#if
9960: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
9970: 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
9980: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
9990: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
99a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
99b0: 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
99c0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
99d0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
99e0: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
99f0: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
9a00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
9a10: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
9a20: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
9a30: 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  t( pPager->dirty
9a40: 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67  Cache==0 || pPag
9a50: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d  er->useJournal==
9a60: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
9a70: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
9a80: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
9a90: 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  2 = sqlite3OsUnl
9aa0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
9ab0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
9ac0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
9ad0: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
9ae0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
9af0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
9b00: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
9b10: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
9b20: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
9b30: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
9b40: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
9b50: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
9b60: 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
9b70: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
9b80: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
9b90: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
9ba0: 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65 72  pFirst;.  pPager
9bb0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
9bc0: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
9bd0: 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
9be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
9bf0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
9c00: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
9c10: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
9c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
9c30: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
9c40: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
9c50: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
9c60: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
9c70: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
9c80: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
9c90: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
9ca0: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
9cb0: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
9cc0: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
9cd0: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
9ce0: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
9cf0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
9d00: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
9d10: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
9d20: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
9d30: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
9d40: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
9d50: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
9d60: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
9d70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
9d80: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
9d90: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
9da0: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
9db0: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
9dc0: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
9dd0: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
9de0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
9df0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
9e00: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
9e10: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
9e20: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
9e30: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
9e40: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
9e50: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
9e60: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
9e70: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
9e80: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
9e90: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
9ea0: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
9eb0: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
9ec0: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
9ed0: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
9ee0: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
9ef0: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
9f00: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
9f10: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
9f20: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
9f30: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
9f40: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
9f50: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
9f60: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
9f70: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
9f80: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
9f90: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
9fa0: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
9fb0: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
9fc0: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
9fd0: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
9fe0: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
9ff0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
a000: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
a010: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
a020: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
a030: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
a040: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
a050: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
a060: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
a070: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
a080: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
a090: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
a0a0: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
a0b0: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f   cksum;.}../* Fo
a0c0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
a0d0: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
a0e0: 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
a0f0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  *);../*.** Read 
a100: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
a110: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
a120: 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69  ile opened on fi
a130: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
a140: 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20   jfd.  Playback 
a150: 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  this one page..*
a160: 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d  *.** If useCksum
a170: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
a180: 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  s journal does n
a190: 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73  ot use checksums
a1a0: 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  .  Checksums.** 
a1b0: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
a1c0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a1d0: 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65  ls because state
a1e0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f  ment journals do
a1f0: 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20   not.** need to 
a200: 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61  survive power fa
a210: 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ilures..*/.stati
a220: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
a230: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
a240: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
a250: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
a260: 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66 73  *jfd,.  i64 offs
a270: 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b 73  et,.  int useCks
a280: 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  um.){.  int rc;.
a290: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
a2c0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
a2d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
a300: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
a310: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
a320: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a340: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
a350: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
a360: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
a370: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
a380: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
a390: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
a3a0: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
a3b0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
a3c0: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
a3d0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
a3e0: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
a3f0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
a400: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
a410: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
a420: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
a430: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
a440: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
a450: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
a460: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
a470: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
a480: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
a490: 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c  its(jfd, offset,
a4a0: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
a4b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
a4c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
a4d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
a4e0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
a4f0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
a500: 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  set+4);.  if( rc
a510: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
a520: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
a530: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a540: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a550: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
a560: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
a570: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
a580: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
a590: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
a5a0: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
a5b0: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
a5c0: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
a5d0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
a5e0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
a5f0: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
a600: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
a610: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
a620: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
a630: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
a640: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
a650: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
a660: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
a670: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
a680: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
a690: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
a6a0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
a6b0: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
a6c0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
a6d0: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
a6e0: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
a6f0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
a700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a710: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
a720: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
a730: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
a740: 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70  offset+pPager->p
a750: 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75  ageSize+4, &cksu
a760: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
a770: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a780: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a790: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
a7a0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
a7b0: 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  ger, aData)!=cks
a7c0: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
a7d0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
a7e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
a7f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
a800: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
a810: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
a820: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
a830: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
a840: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
a850: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
a860: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
a870: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
a880: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
a890: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
a8a0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
a8b0: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
a8c0: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
a8d0: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
a8e0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
a8f0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
a900: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
a910: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
a920: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
a930: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
a940: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
a950: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
a960: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
a970: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
a980: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
a990: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
a9a0: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
a9b0: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
a9c0: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
a9d0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
a9e0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
a9f0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
aa00: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
aa10: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
aa20: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
aa30: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
aa40: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
aa50: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
aa60: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
aa70: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
aa80: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
aa90: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
aaa0: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
aab0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
aac0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
aad0: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
aae0: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
aaf0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
ab00: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
ab10: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
ab20: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
ab30: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ab40: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
ab50: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
ab60: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
ab70: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
ab80: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
ab90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
aba0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
abb0: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
abc0: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
abd0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
abe0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
abf0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
ac00: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
ac10: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
ac20: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
ac30: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
ac40: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
ac50: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
ac60: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
ac70: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
ac80: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
ac90: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
aca0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
acb0: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
acc0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
acd0: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
ace0: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
acf0: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
ad00: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
ad10: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
ad20: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
ad30: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
ad40: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
ad50: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
ad60: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
ad70: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
ad80: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
ad90: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
ada0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
adb0: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
adc0: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
add0: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
ade0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
adf0: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
ae00: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
ae10: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
ae20: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
ae30: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
ae40: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
ae50: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
ae60: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
ae70: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
ae80: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
ae90: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
aea0: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
aeb0: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
aec0: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
aed0: 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54   pgno);.  PAGERT
aee0: 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20  RACE4("PLAYBACK 
aef0: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
af00: 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
af10: 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
af20: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
af30: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
af40: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
af50: 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20   aData));.  if( 
af60: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
af70: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
af80: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67  & (pPg==0 || pPg
af90: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29  ->needSync==0) )
afa0: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
afb0: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
afc0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
afd0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
afe0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
aff0: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
b000: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
b010: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  offset);.    if(
b020: 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61   pPg ){.      ma
b030: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
b040: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
b050: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
b060: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
b070: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
b080: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
b090: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
b0a0: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
b0b0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
b0c0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
b0d0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
b0e0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
b0f0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
b100: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
b110: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
b120: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
b130: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
b140: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
b150: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
b160: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
b170: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
b180: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
b190: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
b1a0: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
b1b0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
b1c0: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
b1d0: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
b1e0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
b1f0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
b200: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
b210: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
b220: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
b230: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
b240: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
b250: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c  ->xReiniter(pPg,
b260: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b270: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
b280: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
b290: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
b2a0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
b2b0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
b2c0: 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
b2d0: 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
b2e0: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
b2f0: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
b300: 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
b310: 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
b320: 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
b330: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
b340: 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
b350: 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
b360: 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
b370: 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
b380: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
b390: 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
b3a0: 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
b3b0: 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
b3c0: 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
b3d0: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
b3e0: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
b3f0: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
b400: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
b410: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
b420: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
b430: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b440: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
b450: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
b460: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
b470: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b480: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
b490: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
b4a0: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
b4b0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
b4c0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
b4d0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
b4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
b4f0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
b500: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   it is..**.** Th
b510: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b520: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
b530: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
b540: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
b550: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
b560: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
b570: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
b580: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
b590: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
b5a0: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
b5b0: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
b5c0: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
b5d0: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
b5e0: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
b5f0: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
b600: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b610: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
b620: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
b630: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
b640: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
b650: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
b660: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
b670: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
b680: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
b690: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
b6a0: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
b6b0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
b6c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
b6d0: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
b6e0: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
b6f0: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
b700: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
b710: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
b720: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
b730: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
b740: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
b750: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
b760: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
b770: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
b780: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
b790: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
b7a0: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
b7b0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
b7c0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
b7d0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
b7e0: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
b7f0: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
b800: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
b810: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
b820: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
b830: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
b840: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
b850: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
b860: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
b870: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
b880: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
b890: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
b8b0: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
b8c0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
b8d0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
b8e0: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
b8f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
b900: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
b910: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
b920: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
b930: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
b940: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
b950: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
b960: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
b970: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
b980: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
b990: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
b9a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b9b0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b9c0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
b9d0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
b9e0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
b9f0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
ba00: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
ba10: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
ba20: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
ba30: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
ba40: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
ba50: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
ba60: 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
ba70: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
ba80: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
ba90: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
baa0: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
bab0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
bac0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
bad0: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
bae0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
baf0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
bb00: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
bb10: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
bb20: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
bb30: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
bb40: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
bb50: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
bb60: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
bb70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bb80: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
bb90: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
bba0: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
bbb0: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
bbc0: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
bbd0: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
bbe0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
bbf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41    if( sqlite3OsA
bc00: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
bc10: 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
bc20: 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
bc30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
bc40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
bc50: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
bc60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
bc70: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
bc80: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
bc90: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
bca0: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
bcb0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
bcc0: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
bcd0: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
bce0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
bcf0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
bd00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
bd10: 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
bd20: 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
bd30: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
bd40: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
bd50: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
bd60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bd70: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
bd80: 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
bd90: 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
bda0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bdb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
bdc0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
bdd0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
bde0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
bdf0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
be00: 4a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  Journal, &zMaste
be10: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
be20: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
be30: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
be40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
be50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
be60: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
be70: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
be80: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
be90: 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63  erPtr!=0 && strc
bea0: 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
beb0: 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
bec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bed0: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
bee0: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
bef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
bf00: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
bf10: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
bf20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
bf30: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
bf40: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
bf50: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
bf60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
bf70: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
bf80: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
bf90: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
bfa0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
bfb0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
bfc0: 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
bfd0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
bfe0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
bff0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c000: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
c010: 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74    }  .  if( mast
c020: 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73  er_open ){.    s
c030: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
c040: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  aster);.  }.  sq
c050: 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
c060: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
c070: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  ;.}...static voi
c080: 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  d pager_truncate
c090: 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
c0a0: 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  ager);../*.** Tr
c0b0: 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20  uncate the main 
c0c0: 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65  file of the give
c0d0: 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e  n pager to the n
c0e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
c0f0: 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73  * indicated. Als
c100: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63  o truncate the c
c110: 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61  ached representa
c120: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
c130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c140: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
c150: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c160: 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
c170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c180: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c190: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
c1a0: 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  SIVE ){.    rc =
c1b0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
c1c0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
c1d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
c1e0: 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d  (i64)nPage);.  }
c1f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c200: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
c210: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
c220: 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ge;.    pager_tr
c230: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
c240: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
c250: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c260: 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69  Set the sectorSi
c270: 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ze for the given
c280: 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   pager..**.** Th
c290: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
c2a0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74   the larger of t
c2b0: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72  he sector size r
c2c0: 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71  eported.** by sq
c2d0: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
c2e0: 65 28 29 20 61 6e 64 20 74 68 65 20 70 61 67 65  e() and the page
c2f0: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
c300: 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
c310: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c320: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63  ){.  pPager->sec
c330: 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
c340: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
c350: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66 28  ager->fd);.  if(
c360: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
c370: 69 7a 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  ize<pPager->page
c380: 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Size ){.    pPag
c390: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
c3a0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
c3b0: 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e;.  }.}../*.** 
c3c0: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
c3d0: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
c3e0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
c3f0: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
c400: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
c410: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
c420: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
c430: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
c440: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
c450: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
c460: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
c470: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
c480: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
c490: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
c4a0: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
c4b0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
c4c0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
c4d0: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
c4e0: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
c4f0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
c500: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
c510: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
c520: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
c530: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
c540: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
c550: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
c560: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
c570: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
c580: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
c590: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
c5a0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
c5b0: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
c5c0: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
c5d0: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
c5e0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
c5f0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
c600: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
c610: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
c620: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
c630: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
c640: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
c650: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
c660: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
c670: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
c680: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
c690: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
c6a0: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
c6b0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
c6c0: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
c6d0: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
c6e0: 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  6)  N bytes of t
c6f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c700: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
c710: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
c720: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
c730: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
c740: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
c750: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
c760: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
c770: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
c780: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
c790: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
c7a0: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
c7b0: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
c7c0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
c7d0: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
c7e0: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
c7f0: 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (7)  Zero or mor
c800: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
c810: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
c820: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
c830: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
c840: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
c850: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
c860: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
c870: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
c880: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
c890: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
c8a0: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
c8b0: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
c8c0: 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74  n the first 6 it
c8d0: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
c8e0: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
c8f0: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
c900: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74  stance of the 7t
c910: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
c920: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
c930: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
c940: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
c950: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
c960: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
c970: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
c980: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
c990: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
c9a0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
c9b0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
c9c0: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
c9d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c9e0: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
c9f0: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
ca00: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
ca10: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
ca20: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
ca30: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
ca40: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
ca50: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
ca60: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
ca70: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
ca80: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
ca90: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
caa0: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
cab0: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
cac0: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
cad0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
cae0: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
caf0: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
cb00: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
cb10: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
cb20: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
cb30: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
cb40: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
cb50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
cb60: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
cb70: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
cb80: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
cb90: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
cba0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
cbb0: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
cbc0: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
cbd0: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
cbe0: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
cbf0: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
cc00: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
cc10: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
cc20: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
cc30: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
cc40: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
cc50: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
cc60: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
cc70: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
cc80: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
cc90: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
cca0: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
ccb0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
ccc0: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
ccd0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
cce0: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
ccf0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
cd00: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
cd10: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
cd20: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
cd30: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
cd40: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
cd50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
cd60: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
cd70: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
cd80: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
cd90: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
cda0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
cdb0: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
cdc0: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
cdd0: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
cde0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
cdf0: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
ce00: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
ce10: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
ce20: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
ce30: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
ce40: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
ce50: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ce60: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
ce70: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
ce80: 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
ce90: 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
cea0: 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
ceb0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
cec0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ced0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
cee0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
cef0: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
cf00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cf10: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
cf20: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
cf30: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
cf40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
cf50: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
cf60: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
cf70: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
cf80: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
cf90: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
cfa0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
cfb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
cfc0: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
cfd0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
cfe0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
cff0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
d000: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
d010: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
d020: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
d030: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
d040: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
d050: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
d060: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
d070: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
d080: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d090: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d0a0: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
d0b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d0c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
d0d0: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
d0e0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
d0f0: 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
d100: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
d110: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
d120: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
d130: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
d140: 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
d150: 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
d160: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d170: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
d180: 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
d190: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
d1a0: 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
d1b0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
d1c0: 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
d1d0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
d1e0: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
d1f0: 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
d200: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
d210: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
d220: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
d230: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d240: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
d250: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d260: 0a 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20  .   || (zMaster 
d270: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63  && !sqlite3OsAcc
d280: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
d290: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
d2a0: 5f 45 58 49 53 54 53 29 29 20 0a 20 20 29 7b 0a  _EXISTS)) .  ){.
d2b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d2c0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a  (zMaster);.    z
d2d0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
d2e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
d2f0: 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
d300: 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  E_OK;.    goto e
d310: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
d320: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
d330: 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a  alOff = 0;..  /*
d340: 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
d350: 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
d360: 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
d370: 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
d380: 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
d390: 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
d3a0: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
d3b0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
d3c0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
d3d0: 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
d3e0: 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
d3f0: 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
d400: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
d410: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
d420: 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
d430: 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
d440: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
d450: 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
d460: 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
d470: 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
d480: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
d490: 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
d4a0: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
d4b0: 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
d4c0: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
d4d0: 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
d4e0: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
d4f0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
d500: 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
d510: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d520: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
d530: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d540: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
d550: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d570: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
d580: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
d590: 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
d5a0: 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
d5b0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
d5c0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
d5d0: 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
d5e0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
d5f0: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
d600: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
d610: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
d620: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
d630: 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
d640: 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
d650: 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
d660: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
d670: 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
d680: 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
d690: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
d6a0: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
d6b0: 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
d6c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
d6d0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
d6e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d6f0: 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
d700: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
d710: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
d720: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
d730: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
d740: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
d750: 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
d760: 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
d770: 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
d780: 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
d790: 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
d7a0: 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
d7b0: 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
d7c0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
d7d0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
d7e0: 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
d7f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
d800: 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
d810: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
d820: 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
d830: 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
d840: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
d850: 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
d860: 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
d870: 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
d880: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
d890: 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
d8a0: 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
d8b0: 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
d8c0: 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
d8d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
d8e0: 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
d8f0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
d900: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
d910: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d920: 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
d930: 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
d940: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
d950: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d960: 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
d970: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
d980: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
d990: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
d9a0: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
d9b0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
d9c0: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
d9d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
d9e0: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
d9f0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
da00: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
da10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
da20: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
da30: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
da40: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
da50: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
da60: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
da70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
da80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
da90: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
daa0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
dab0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
dac0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
dad0: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
dae0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
daf0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
db00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
db10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
db20: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
db30: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
db40: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
db50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
db60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
db70: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
db80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
db90: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
dba0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
dbb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
dbc0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
dbd0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
dbe0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dbf0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dc00: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
dc10: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
dc20: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
dc30: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
dc40: 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
dc50: 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
dc60: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
dc70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dc80: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
dc90: 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
dca0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
dcb0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
dcc0: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
dcd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
dce0: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
dcf0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
dd00: 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
dd10: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
dd20: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
dd30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
dd40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
dd50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
dd60: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
dd70: 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
dd80: 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
dd90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
dda0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
ddb0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
ddc0: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
ddd0: 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
dde0: 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
ddf0: 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
de00: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
de10: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
de20: 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
de30: 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
de40: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
de50: 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
de60: 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
de70: 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
de80: 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
de90: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
dea0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
deb0: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
dec0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
ded0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
dee0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
def0: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
df00: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
df10: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
df20: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
df30: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
df40: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
df50: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
df60: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
df70: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
df80: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
df90: 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
dfa0: 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
dfb0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
dfc0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
dfd0: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
dfe0: 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
dff0: 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
e000: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
e010: 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
e020: 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
e030: 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
e040: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
e050: 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
e060: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
e070: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
e080: 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
e090: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
e0a0: 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
e0b0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
e0c0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
e0d0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e0e0: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
e0f0: 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
e100: 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e120: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
e130: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
e160: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
e170: 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
e180: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64  ournalOff;.#ifnd
e190: 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20  ef NDEBUG .  {. 
e1a0: 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20     i64 os_szJ;. 
e1b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e1c0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
e1d0: 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b  ->jfd, &os_szJ);
e1e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
e1f0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
e200: 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
e210: 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20  szJ==os_szJ );. 
e220: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
e230: 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65  Set hdrOff to be
e240: 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74   the offset just
e250: 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
e260: 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e  f the last journ
e270: 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69  al.  ** page wri
e280: 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tten before the 
e290: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
e2a0: 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74  ader for this st
e2b0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
e2c0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69  nsaction was wri
e2d0: 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64  tten, or the end
e2e0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20   of the file if 
e2f0: 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  no journal.  ** 
e300: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
e310: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66  en..  */.  hdrOf
e320: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
e330: 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  HdrOff;.  assert
e340: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
e350: 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b  nc || !hdrOff );
e360: 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29  .  if( !hdrOff )
e370: 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73  {.    hdrOff = s
e380: 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  zJ;.  }.  .  /* 
e390: 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
e3a0: 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74  abase back to it
e3b0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
e3c0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
e3d0: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
e3e0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  er, pPager->stmt
e3f0: 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
e400: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
e410: 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
e420: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
e430: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
e440: 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  s are in the sta
e450: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
e460: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
e470: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
e480: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
e490: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65  nalOpen );.  nRe
e4a0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
e4b0: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
e4c0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
e4d0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
e4e0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
e4f0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
e500: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
e510: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
e520: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
e530: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
e540: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
e550: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
e560: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
e570: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
e580: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
e590: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
e5a0: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
e5b0: 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
e5c0: 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73  +){.    i64 offs
e5d0: 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72  et = i*(4+pPager
e5e0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
e5f0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
e600: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
e610: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
e620: 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a  fd, offset, 0);.
e630: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
e640: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
e650: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e660: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
e670: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
e680: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
e690: 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
e6a0: 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
e6b0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
e6c0: 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
e6d0: 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
e6e0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
e6f0: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
e700: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
e710: 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
e720: 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
e730: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
e740: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
e750: 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
e760: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
e770: 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
e780: 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
e790: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
e7a0: 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
e7b0: 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
e7c0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
e7d0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
e7e0: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
e7f0: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
e800: 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
e810: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
e820: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
e830: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
e840: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
e850: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
e860: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
e870: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
e880: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
e890: 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
e8a0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
e8b0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
e8c0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
e8d0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
e8e0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a  journalOff, 1);.
e8f0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
e900: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
e910: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e920: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
e930: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
e940: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
e950: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e960: 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
e970: 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20   nJRec;         
e980: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
e990: 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
e9a0: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
e9b0: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
e9c0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
e9d0: 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
e9e0: 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
e9f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ea00: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ea10: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ea20: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
ea30: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
ea40: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63   }.    if( nJRec
ea50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52  ==0 ){.      nJR
ea60: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
ea70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
ea80: 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
ea90: 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
eaa0: 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b    for(i=nJRec-1;
eab0: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
eac0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
ead0: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
eae0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
eaf0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
eb00: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
eb10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
eb20: 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  Off, 1);.      a
eb30: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
eb40: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
eb50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
eb60: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
eb70: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
eb80: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
eb90: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
eba0: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
ebb0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
ebc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
ebd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ebe0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
ebf0: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
ec00: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
ec10: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
ec20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
ec30: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
ec40: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
ec50: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
ec60: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
ec70: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
ec80: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
ec90: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
eca0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
ecb0: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
ecc0: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
ecd0: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
ece0: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
ecf0: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
ed00: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
ed10: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
ed20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
ed30: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
ed40: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
ed50: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
ed60: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
ed70: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
ed80: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
ed90: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
eda0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
edb0: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
edc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
edd0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
ede0: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
edf0: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
ee00: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
ee10: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
ee20: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
ee30: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
ee40: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
ee50: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
ee60: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
ee70: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
ee80: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
ee90: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
eea0: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
eeb0: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
eec0: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
eee0: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
eef0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
ef00: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
ef10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ef20: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
ef30: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
ef40: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
ef50: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
ef60: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
ef70: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
ef80: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
ef90: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
efb0: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
efc0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
efd0: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
efe0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
eff0: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
f000: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
f010: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
f020: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
f030: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
f040: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
f050: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
f060: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
f070: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f080: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
f090: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
f0a0: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
f0b0: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
f0c0: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
f0d0: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
f0e0: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
f0f0: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
f100: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
f110: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
f120: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
f130: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
f140: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
f150: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
f160: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
f170: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
f180: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
f190: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
f1a0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
f1b0: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
f1c0: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
f1d0: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
f1e0: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
f1f0: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
f200: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
f210: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
f220: 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
f230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
f240: 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
f250: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
f260: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
f270: 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
f280: 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
f290: 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
f2a0: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
f2b0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
f2c0: 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
f2d0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
f2e0: 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
f2f0: 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a  c = full_fsync;.
f300: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
f310: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
f320: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
f330: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
f340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
f350: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
f360: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
f370: 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
f380: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
f390: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
f3a0: 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
f3b0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
f3c0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
f3d0: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
f3e0: 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
f3f0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
f400: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
f410: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
f420: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
f430: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a  mporary file. .*
f440: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
f450: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
f460: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
f470: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
f480: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
f490: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
f4a0: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
f4b0: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
f4c0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
f4d0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  he temporary.** 
f4e0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
f4f0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
f500: 20 7a 4e 61 6d 65 4f 75 74 20 69 73 20 30 2c 20   zNameOut is 0, 
f510: 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 50 45 4e  then SQLITE_OPEN
f520: 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 69 73 20 70  _SUBJOURNAL is p
f530: 61 73 73 65 64 20 74 6f 20 74 68 65 20 4f 53 20  assed to the OS 
f540: 6c 61 79 65 72 2e 0a 2a 2a 20 49 66 20 7a 4e 61  layer..** If zNa
f550: 6d 65 4f 75 74 20 69 73 20 6e 6f 74 20 30 2c 20  meOut is not 0, 
f560: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
f570: 5f 44 42 20 69 73 20 70 61 73 73 65 64 2e 0a 2a  _DB is passed..*
f580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
f590: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
f5a0: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  p(.  sqlite3_vfs
f5b0: 20 2a 70 56 66 73 2c 20 0a 20 20 73 71 6c 69 74   *pVfs, .  sqlit
f5c0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
f5d0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 4f 75  .  char *zNameOu
f5e0: 74 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  t.){.  int cnt =
f5f0: 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   8;.  int rc;.  
f600: 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
f610: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
f620: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
f630: 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  REATE|SQLITE_OPE
f640: 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 0a 20  N_EXCLUSIVE);.. 
f650: 20 63 68 61 72 20 2a 7a 46 72 65 65 20 3d 20 30   char *zFree = 0
f660: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 4f 75 74  ;.  if( zNameOut
f670: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 72 65 65  ==0 ){.    zFree
f680: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
f690: 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e  e3_malloc(pVfs->
f6a0: 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  mxPathname);.   
f6b0: 20 69 66 28 20 21 7a 46 72 65 65 20 29 7b 0a 20   if( !zFree ){. 
f6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f6d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
f6e0: 20 20 20 20 7a 4e 61 6d 65 4f 75 74 20 3d 20 7a      zNameOut = z
f6f0: 46 72 65 65 3b 0a 20 20 20 20 66 6c 61 67 73 20  Free;.    flags 
f700: 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
f710: 55 42 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 65 6c  UBJOURNAL;.  }el
f720: 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  se{.    flags |=
f730: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
f740: 50 5f 44 42 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  P_DB;.  }..#ifde
f750: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
f760: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
f770: 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
f780: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
f790: 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
f7a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f   */.#endif..  do
f7b0: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
f7c0: 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
f7d0: 70 4e 61 6d 65 28 70 56 66 73 2c 20 7a 4e 61 6d  pName(pVfs, zNam
f7e0: 65 4f 75 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  eOut);.    rc = 
f7f0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
f800: 66 73 2c 20 7a 4e 61 6d 65 4f 75 74 2c 20 70 46  fs, zNameOut, pF
f810: 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ile, flags, 0);.
f820: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
f830: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69  SQLITE_OK || pFi
f840: 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  le->pMethods );.
f850: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
f860: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
f870: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
f880: 4f 4d 45 4d 20 29 3b 0a 0a 20 20 73 71 6c 69 74  OMEM );..  sqlit
f890: 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a  e3_free(zFree);.
f8a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f8b0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
f8c0: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
f8d0: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
f8e0: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
f8f0: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
f900: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
f910: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
f920: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
f930: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
f940: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
f950: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
f960: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
f970: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
f980: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
f990: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
f9a0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
f9b0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
f9c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
f9d0: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
f9e0: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
f9f0: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
fa00: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
fa10: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
fa20: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
fa30: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
fa40: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
fa50: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
fa60: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
fa70: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
fa80: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
fa90: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
faa0: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
fab0: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
fac0: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
fad0: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
fae0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
faf0: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
fb00: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
fb10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
fb20: 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
fb30: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20  te3_vfs *pVfs,. 
fb40: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
fb50: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
fb60: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
fb70: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
fb80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
fb90: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
fba0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
fbb0: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
fbc0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbe0: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
fbf0: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
fc00: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
fc10: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
fc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
fc30: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
fc40: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
fc50: 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
fc60: 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
fc70: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
fc80: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
fc90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fca0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
fcb0: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
fcc0: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
fcd0: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
fce0: 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
fcf0: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
fd00: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
fd10: 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
fd20: 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
fd30: 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
fd40: 4f 43 4b 29 21 3d 30 3b 0a 0a 23 69 66 64 65 66  OCK)!=0;..#ifdef
fd50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
fd60: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
fd70: 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
fd80: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
fd90: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
fda0: 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
fdb0: 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
fdc0: 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
fdd0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fde0: 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
fdf0: 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
fe00: 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
fe10: 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
fe20: 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
fe30: 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
fe40: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
fe50: 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
fe60: 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
fe70: 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49  oc can be set. I
fe80: 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20  t would be nice 
fe90: 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74  to assert.  ** t
fea0: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
feb0: 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Alloc is non-zer
fec0: 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73  o, but alas this
fed0: 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73   breaks test cas
fee0: 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  es .  ** written
fef0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70   to invoke the p
ff00: 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20  ager directly.. 
ff10: 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
ff20: 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
ff30: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
ff40: 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a  assert( pTsd );.
ff50: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 65 20  #endif..  /* We 
ff60: 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 66 20  used to test if 
ff70: 6d 61 6c 6c 6f 63 28 29 20 68 61 64 20 61 6c 72  malloc() had alr
ff80: 65 61 64 79 20 66 61 69 6c 65 64 20 62 65 66 6f  eady failed befo
ff90: 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20 0a  re proceeding. .
ffa0: 20 20 2a 2a 20 42 75 74 20 74 68 65 20 77 61 79    ** But the way
ffb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ffc0: 73 20 75 73 65 64 20 69 6e 20 53 51 4c 69 74 65  s used in SQLite
ffd0: 20 6d 65 61 6e 73 20 74 68 61 74 20 63 61 6e 20   means that can 
ffe0: 6e 65 76 65 72 0a 20 20 2a 2a 20 68 61 70 70 65  never.  ** happe
fff0: 6e 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  n. Furthermore, 
10000 69 66 20 74 68 65 20 6d 61 6c 6c 6f 63 2d 66 61  if the malloc-fa
10010 69 6c 65 64 20 66 6c 61 67 20 69 73 20 61 6c 72  iled flag is alr
10020 65 61 64 79 20 73 65 74 2c 20 0a 20 20 2a 2a 20  eady set, .  ** 
10030 65 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20  either the call 
10040 74 6f 20 73 71 6c 69 74 65 33 53 74 72 44 75 70  to sqlite3StrDup
10050 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 61  () or sqlite3_ma
10060 6c 6c 6f 63 28 29 20 62 65 6c 6f 77 20 77 69 6c  lloc() below wil
10070 6c 0a 20 20 2a 2a 20 66 61 69 6c 20 73 68 6f 72  l.  ** fail shor
10080 74 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e  tly and SQLITE_N
10090 4f 4d 45 4d 20 72 65 74 75 72 6e 65 64 20 61 6e  OMEM returned an
100a0 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  yway..  */.  *pp
100b0 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
100c0 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
100d0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73   for the pager s
100e0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50  tructure */.  pP
100f0 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61  ager = sqlite3Ma
10100 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69  llocZero(.    si
10110 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
10120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
10130 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
10140 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69      pVfs->szOsFi
10150 6c 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20 20  le * 3 +        
10160 2f 2a 20 54 68 65 20 64 62 2c 20 6a 6f 75 72 6e  /* The db, journ
10170 61 6c 20 61 6e 64 20 73 74 6d 74 20 6a 6f 75 72  al and stmt jour
10180 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
10190 20 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61    pVfs->mxPathna
101a0 6d 65 20 2a 20 33 20 2b 20 33 30 20 20 20 2f 2a  me * 3 + 30   /*
101b0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72   zFilename, zDir
101c0 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c  ectory, zJournal
101d0 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21   */.  );.  if( !
101e0 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 72 65  pPager ){.    re
101f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10200 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d 20  M;.  }.  pPtr = 
10210 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d  (u8 *)&pPager[1]
10220 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
10230 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
10240 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
10250 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65  File*0];.  pPage
10260 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  r->jfd = (sqlite
10270 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
10280 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b  fs->szOsFile*1];
10290 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20  .  pPager->stfd 
102a0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
102b0 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
102c0 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67  sFile*2];.  pPag
102d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
102e0 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66  (char*)&pPtr[pVf
102f0 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 33 5d 3b 0a  s->szOsFile*3];.
10300 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
10310 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
10320 7a 46 69 6c 65 6e 61 6d 65 5b 70 56 66 73 2d 3e  zFilename[pVfs->
10330 6d 78 50 61 74 68 6e 61 6d 65 5d 3b 0a 20 20 70  mxPathname];.  p
10340 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
10350 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
10360 63 74 6f 72 79 5b 70 56 66 73 2d 3e 6d 78 50 61  ctory[pVfs->mxPa
10370 74 68 6e 61 6d 65 5d 3b 0a 20 20 70 50 61 67 65  thname];.  pPage
10380 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
10390 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
103a0 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65  ager file and se
103b0 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t zFullPathname 
103c0 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c  to point at mall
103d0 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d  oc()ed .  ** mem
103e0 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
103f0 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65  he complete file
10400 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75  name (i.e. inclu
10410 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  ding the directo
10420 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ry)..  */.  if( 
10430 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
10440 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66  lename[0] ){.#if
10450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10460 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
10470 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
10480 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
10490 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
104a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
104b0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
104c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7d 65 6c   = '\0';.    }el
104d0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
104e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
104f0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
10500 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
10510 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
10520 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
10530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10540 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
10550 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  len(pPager->zFil
10560 65 6e 61 6d 65 29 3e 28 70 56 66 73 2d 3e 6d 78  ename)>(pVfs->mx
10570 50 61 74 68 6e 61 6d 65 20 2d 20 73 74 72 6c 65  Pathname - strle
10580 6e 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29  n("-journal")) )
10590 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
105a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
105b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
105c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
105d0 66 6c 61 67 20 3d 20 0a 20 20 20 20 20 20 20 20  flag = .        
105e0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
105f0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
10600 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
10610 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
10620 5f 44 42 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _DB);.          
10630 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
10640 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10650 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
10660 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
10670 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
10680 6f 66 6c 61 67 2c 20 26 66 6f 75 74 29 3b 0a 20  oflag, &fout);. 
10690 20 20 20 20 20 20 20 20 20 72 65 61 64 4f 6e 6c           readOnl
106a0 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
106b0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
106c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
106d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
106e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
106f0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
10700 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 66 64  pVfs, pPager->fd
10710 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
10720 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
10730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10740 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
10750 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
10760 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63  if( pPager && rc
10770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10780 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
10790 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73  pace = (char *)s
107a0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 53 51  qlite3_malloc(SQ
107b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
107c0 45 5f 53 49 5a 45 29 3b 0a 20 20 7d 0a 0a 20 20  E_SIZE);.  }..  
107d0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
107e0 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
107f0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
10800 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d  bove, free the m
10810 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e  emory .  ** poin
10820 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50  ted to by zFullP
10830 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68  athname, free th
10840 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
10850 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
10860 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63  .  ** file. Sinc
10870 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
10880 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
10890 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
108a0 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
108b0 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
108c0 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
108d0 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 70  f( !pPager || !p
108e0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
108f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10900 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
10910 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
10920 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
10930 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53    return ((rc==S
10940 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45  QLITE_OK)?SQLITE
10950 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a  _NOMEM:rc);.  }.
10960 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
10970 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
10980 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c  ILEHANDLEID(fd),
10990 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
109a0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
109b0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
109c0 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  er, zFullPathnam
109d0 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e))..  /* Fill i
109e0 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f  n Pager.zDirecto
109f0 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  ry[] */.  memcpy
10a00 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
10a10 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ory, pPager->zFi
10a20 6c 65 6e 61 6d 65 2c 20 70 56 66 73 2d 3e 6d 78  lename, pVfs->mx
10a30 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Pathname);.  for
10a40 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72  (i=strlen(pPager
10a50 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69  ->zDirectory); i
10a60 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
10a70 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
10a80 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
10a90 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
10aa0 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
10ab0 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   0;..  /* Fill i
10ac0 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  n Pager.zJournal
10ad0 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  [] */.  memcpy(p
10ae0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
10af0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
10b00 6d 65 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  me, pVfs->mxPath
10b10 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  name);.  memcpy(
10b20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
10b30 6c 5b 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d  l[strlen(pPager-
10b40 3e 7a 4a 6f 75 72 6e 61 6c 29 5d 2c 20 22 2d 6a  >zJournal)], "-j
10b50 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20 20  ournal", 9);..  
10b60 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
10b70 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
10b80 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
10b90 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
10ba0 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
10bb0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
10bc0 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
10bd0 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
10be0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
10bf0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
10c00 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
10c10 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
10c20 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
10c30 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
10c40 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
10c50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10c60 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
10c70 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
10c80 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
10c90 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
10ca0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
10cb0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
10cc0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
10cd0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
10ce0 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
10cf0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
10d00 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10d10 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65 72 74 28  COUNT;.  assert(
10d20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30   PAGER_UNLOCK==0
10d30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
10d40 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
10d50 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
10d60 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
10d70 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
10d80 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
10d90 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
10da0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
10db0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
10dc0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
10dd0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
10de0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
10df0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
10e00 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
10e10 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
10e20 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
10e30 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
10e40 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
10e50 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
10e60 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
10e70 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
10e80 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
10e90 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
10ea0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
10eb0 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
10ec0 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
10ed0 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
10ee0 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
10ef0 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
10f00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
10f10 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
10f20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
10f30 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
10f40 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
10f50 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
10f60 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  r->nExtra = FORC
10f70 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
10f80 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ra);.  assert(pP
10f90 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
10fa0 64 73 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66  ds||memDb);.  if
10fb0 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
10fc0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
10fd0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ager);.  }.  /* 
10fe0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10ff0 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
11000 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
11010 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
11020 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
11030 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
11040 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65   = pPager;.#ifde
11050 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11060 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
11070 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  T.  pPager->pNex
11080 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72  t = pTsd->pPager
11090 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72  ;.  pTsd->pPager
110a0 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69   = pPager;.#endi
110b0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
110c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
110d0 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
110e0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
110f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
11100 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
11110 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11120 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
11130 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
11140 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
11150 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
11160 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
11170 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
11180 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
11190 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
111a0 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
111b0 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
111c0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
111d0 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
111e0 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
111f0 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
11200 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
11210 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
11220 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
11230 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
11240 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
11250 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
11260 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
11270 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
11280 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
11290 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
112a0 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
112b0 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  lled by sqlite3P
112c0 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a  agerUnref()..*/.
112d0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
112e0 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50  rSetDestructor(P
112f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
11300 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61  id (*xDesc)(DbPa
11310 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
11320 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
11330 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
11340 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
11350 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
11360 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
11370 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
11380 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
11390 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
113a0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
113b0 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
113c0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
113d0 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
113e0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
113f0 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
11400 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
11410 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
11420 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
11430 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
11440 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
11450 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
11460 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
11470 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
11480 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
11490 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
114a0 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
114b0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69  einit)(DbPage*,i
114c0 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
114d0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
114e0 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
114f0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
11500 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
11510 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73   size.  If the s
11520 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a  uggest new page.
11530 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70  ** size is inapp
11540 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
11550 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
11560 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63  ge size is selec
11570 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ted.** and retur
11580 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
11590 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
115a0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
115b0 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  r, int pageSize)
115c0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  {.  assert( page
115d0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
115e0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
115f0 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
11600 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
11610 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  mDb && pPager->n
11620 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61  Ref==0 ){.    pa
11630 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
11640 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
11650 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
11660 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ze;.    sqlite3_
11670 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  free(pPager->pTm
11680 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 50 61  pSpace);.    pPa
11690 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
116a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
116b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  pageSize);.  }. 
116c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
116d0 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
116e0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
116f0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
11700 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
11710 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
11720 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
11730 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
11740 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
11750 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
11760 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
11770 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
11780 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
11790 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
117a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
117b0 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
117c0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
117d0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
117e0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
117f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
11800 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
11810 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
11820 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
11830 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
11840 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
11850 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
11860 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
11870 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
11880 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
11890 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
118a0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
118b0 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
118c0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
118d0 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
118e0 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
118f0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
11900 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
11910 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
11920 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
11930 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
11940 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
11950 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
11960 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
11970 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
11980 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
11990 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
119a0 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
119b0 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
119c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
119d0 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
119e0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
119f0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
11a00 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
11a10 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
11a20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
11a30 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
11a40 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11a50 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
11a60 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
11a70 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
11a80 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
11a90 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
11aa0 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
11ab0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
11ac0 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
11ad0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
11ae0 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
11af0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
11b00 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
11b10 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
11b20 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
11b30 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
11b40 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
11b50 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
11b60 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
11b70 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11b80 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
11b90 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
11ba0 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
11bb0 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
11bc0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
11bd0 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
11be0 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
11bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
11c00 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
11c10 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
11c20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
11c30 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
11c40 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
11c50 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
11c60 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
11c70 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
11c80 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
11c90 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
11ca0 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
11cb0 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
11cc0 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
11cd0 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
11ce0 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
11cf0 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
11d00 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
11d10 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
11d20 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73   this)..*/.int s
11d30 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
11d40 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
11d50 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
11d60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
11d70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
11d80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
11d90 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
11da0 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d  N);.  if( MEMDB=
11db0 3d 30 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  =0 ){.    IOTRAC
11dc0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
11dd0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
11de0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
11df0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
11e00 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
11e10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11e20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
11e30 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
11e40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11e50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11e60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11e70 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
11e80 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
11e90 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
11ea0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
11eb0 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
11ec0 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
11ed0 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
11ee0 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
11ef0 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
11f00 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
11f10 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
11f20 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
11f30 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
11f40 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
11f50 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
11f60 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
11f70 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
11f80 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
11f90 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
11fa0 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
11fb0 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
11fc0 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
11fd0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11fe0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
11ff0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
12000 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  n;.  int rc;.  a
12010 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
12020 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
12030 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12040 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
12050 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
12060 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
12070 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
12080 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
12090 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
120a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
120b0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
120c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
120d0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
120e0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
120f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
12100 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
12110 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
12120 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
12130 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
12140 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
12150 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
12160 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
12170 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
12180 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
12190 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
121a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
121b0 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
121c0 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
121d0 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
121e0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61  .  }.  if( n>pPa
121f0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
12200 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
12210 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  o = n;.  }.  ret
12220 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
12230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
12240 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
12250 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
12260 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
12270 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
12280 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
12290 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st){.  sqlite3_f
122a0 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
122b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
122c0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
122d0 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
122e0 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
122f0 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
12300 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
12310 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
12320 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
12330 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
12340 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
12350 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
12360 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
12370 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
12380 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
12390 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
123a0 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
123b0 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
123c0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
123d0 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
123e0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
123f0 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
12400 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
12410 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
12420 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
12430 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
12440 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
12450 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
12460 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
12470 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
12480 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
12490 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
124a0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
124b0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
124c0 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pgno==0 ){.    a
124d0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
124e0 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
124f0 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
12500 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12510 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
12520 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
12530 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
12540 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
12550 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
12560 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
12570 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
12580 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
12590 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
125a0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70  er->nHash-1)]!=p
125b0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
125c0 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
125d0 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
125e0 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
125f0 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e     int h = pPg->
12600 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
12610 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50  nHash-1);.    pP
12620 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
12630 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
12640 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
12650 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73   ){.    clearHis
12660 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
12670 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
12680 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e  ;.  }.  pPg->pgn
12690 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e  o = 0;.  pPg->pN
126a0 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
126b0 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
126c0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
126d0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
126e0 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
126f0 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
12700 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
12710 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
12720 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
12730 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
12740 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
12750 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
12760 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
12770 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
12780 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
12790 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
127a0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
127b0 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
127c0 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
127d0 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
127e0 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
127f0 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
12800 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
12810 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
12820 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
12830 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
12840 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
12850 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
12860 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
12870 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
12880 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
12890 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
128a0 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
128b0 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
128c0 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
128d0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
128e0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
128f0 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
12900 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
12910 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
12920 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
12930 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
12940 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
12950 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
12960 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
12970 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
12980 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
12990 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
129a0 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
129b0 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
129c0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
129d0 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
129e0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
129f0 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
12a00 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69   table */.  unli
12a10 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
12a20 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  er, pPg);.}../*.
12a30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12a40 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
12a50 61 74 65 20 74 68 65 20 63 61 63 68 65 20 77 68  ate the cache wh
12a60 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  en a database.**
12a70 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20   is truncated.  
12a80 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61  Drop from the ca
12a90 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68  che all pages wh
12aa0 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c  ose pgno is.** l
12ab0 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
12ac0 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73  r->dbSize and is
12ad0 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a   unreferenced..*
12ae0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  *.** Referenced 
12af0 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
12b00 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
12b10 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
12b20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20  ** Actually, at 
12b30 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72  the point this r
12b40 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12b50 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  , it would be.**
12b60 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76   an error to hav
12b70 65 20 61 20 72 65 66 65 72 65 6e 63 65 64 20 70  e a referenced p
12b80 61 67 65 2e 20 20 42 75 74 20 72 61 74 68 65 72  age.  But rather
12b90 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20   than delete.** 
12ba0 74 68 61 74 20 70 61 67 65 20 61 6e 64 20 67 75  that page and gu
12bb0 61 72 61 6e 74 65 65 20 61 20 73 75 62 73 65 71  arantee a subseq
12bc0 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69  uent segfault, i
12bd0 74 20 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a  t seems better.*
12be0 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64  * to zero it and
12bf0 20 68 6f 70 65 20 74 68 61 74 20 77 65 20 65 72   hope that we er
12c00 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a  ror out sanely..
12c10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
12c20 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
12c30 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
12c40 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
12c50 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67  ;.  PgHdr **ppPg
12c60 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d  ;.  int dbSize =
12c70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
12c80 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67  ..  ppPg = &pPag
12c90 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c  er->pAll;.  whil
12ca0 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29  e( (pPg = *ppPg)
12cb0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
12cc0 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65  Pg->pgno<=dbSize
12cd0 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d   ){.      ppPg =
12ce0 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
12cf0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
12d00 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  Pg->nRef>0 ){.  
12d10 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
12d20 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
12d30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
12d40 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20  ze);.      ppPg 
12d50 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
12d60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12d70 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e     *ppPg = pPg->
12d80 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
12d90 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
12da0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
12db0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
12dc0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
12dd0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  (sqlite3_pager_p
12de0 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20  gfree_count);.  
12df0 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
12e00 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43  Pg);.      makeC
12e10 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20  lean(pPg);.     
12e20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
12e30 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
12e40 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
12e50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
12e60 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
12e70 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
12e80 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
12e90 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
12ea0 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
12eb0 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
12ec0 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  e.  Repeat until
12ed0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
12ee0 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
12ef0 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
12f00 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
12f10 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
12f20 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
12f30 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
12f40 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
12f50 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
12f60 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
12f70 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
12f80 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
12f90 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
12fa0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
12fb0 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
12fc0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
12fd0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
12fe0 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
12ff0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
13000 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
13010 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
13020 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
13030 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
13040 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
13050 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
13060 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
13070 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13080 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
13090 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
130a0 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
130b0 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73   unknown */.  as
130c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
130d0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
130e0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
130f0 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29  ize<0 || MEMDB )
13100 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
13110 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
13120 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13130 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
13140 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
13150 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
13160 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
13170 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
13180 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
13190 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
131a0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
131b0 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
131c0 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
131d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
131e0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
131f0 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
13200 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
13210 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
13220 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
13230 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
13240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13250 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
13260 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
13270 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
13280 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
13290 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
132a0 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
132b0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
132c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
132d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
132e0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
132f0 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20  D || MEMDB );.  
13300 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13310 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
13320 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
13330 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
13340 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13350 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
13360 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
13370 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
13380 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
13390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
133a0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  OK;.  }.  if( ME
133b0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
133c0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
133d0 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
133e0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
133f0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
13400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13410 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
13420 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
13430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13440 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
13450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
13460 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13470 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13480 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
13490 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
134a0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
134b0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
134c0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
134d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
134e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
134f0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
13500 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
13510 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
13520 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13530 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
13540 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
13550 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
13560 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
13570 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
13580 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
13590 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
135a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
135b0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
135c0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
135d0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
135e0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
135f0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
13600 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
13610 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
13620 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
13630 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
13640 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
13650 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
13660 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
13670 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
13680 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
13690 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
136a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
136b0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
136c0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
136d0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
136e0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
136f0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
13700 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
13710 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
13720 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
13730 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
13740 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
13750 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
13760 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
13770 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
13780 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
13790 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
137a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
137b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
137c0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
137d0 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
137e0 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
137f0 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
13800 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
13810 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
13820 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
13830 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
13840 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
13850 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
13860 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
13870 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
13880 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
13890 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
138a0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
138b0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
138c0 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
138d0 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
138e0 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  t..  */.  Thread
138f0 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
13900 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
13910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13920 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
13930 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41  pTsd && pTsd->nA
13940 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  lloc );.#endif..
13950 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
13960 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
13970 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
13980 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
13990 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
139a0 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
139b0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
139c0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
139d0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
139e0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
139f0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
13a00 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
13a10 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
13a20 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
13a30 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
13a40 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
13a50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13a60 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
13a70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
13a80 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
13a90 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
13aa0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13ab0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
13ac0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13ad0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
13ae0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13af0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
13b00 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
13b10 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
13b20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
13b30 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
13b40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
13b50 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
13b60 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
13b70 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
13b80 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
13b90 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
13ba0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
13bb0 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
13bc0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13bd0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
13be0 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65  ** }.  */..#ifde
13bf0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13c00 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
13c10 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  T.  /* Remove th
13c20 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65  e pager from the
13c30 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
13c40 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20  pagers starting 
13c50 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44  at .  ** ThreadD
13c60 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65  ata.pPager if me
13c70 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
13c80 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f  is enabled..  */
13c90 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70  .  if( pPager==p
13ca0 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  Tsd->pPager ){. 
13cb0 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20     pTsd->pPager 
13cc0 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
13cd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61  .  }else{.    Pa
13ce0 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66  ger *pTmp;.    f
13cf0 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e  or(pTmp = pTsd->
13d00 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e  pPager; pTmp->pN
13d10 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d  ext!=pPager; pTm
13d20 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d  p=pTmp->pNext){}
13d30 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74  .    pTmp->pNext
13d40 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
13d50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
13d60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
13d70 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71  er->aHash);.  sq
13d80 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
13d90 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
13da0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
13db0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
13dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
13dd0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
13de0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
13df0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
13e00 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
13e10 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
13e20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
13e30 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
13e40 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
13e50 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65  DbPage *p){.  re
13e60 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
13e70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
13e80 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e  e page_ref() fun
13e90 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ction increments
13ea0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
13eb0 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
13ec0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
13ed0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
13ee0 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68  the freelist (th
13ef0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
13f00 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a  t is zero) then.
13f10 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** remove it fro
13f20 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  m the freelist..
13f30 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65  **.** For non-te
13f40 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
13f50 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72  _ref() is a macr
13f60 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61  o that calls _pa
13f70 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69  ge_ref().** onli
13f80 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ne of the refere
13f90 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
13fa0 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73  o.  For test sys
13fb0 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
13fc0 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75  .** is a real fu
13fd0 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77  nction so that w
13fe0 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70  e can set breakp
13ff0 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20  oints and trace 
14000 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
14010 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48  id _page_ref(PgH
14020 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
14030 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
14040 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
14050 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
14060 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
14070 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20  emove it. */.   
14080 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70   if( pPg==pPg->p
14090 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
140a0 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ced ){.      PgH
140b0 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
140c0 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68  xtFree;.      wh
140d0 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
140e0 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
140f0 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
14100 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
14110 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
14120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14130 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
14140 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
14150 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
14160 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
14170 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
14180 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
14190 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
141a0 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
141b0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
141c0 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20  extFree ){.     
141d0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
141e0 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
141f0 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
14200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
14210 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  g->pPager->pLast
14220 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
14230 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  e;.    }.    pPg
14240 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
14250 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
14260 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f++;.  REFINFO(p
14270 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  Pg);.}.#ifdef SQ
14280 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
14290 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
142a0 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
142b0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
142c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
142d0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
142e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
142f0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  g->nRef++;.     
14300 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
14310 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23     }.  }.#else.#
14320 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66   define page_ref
14330 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66  (P)   ((P)->nRef
14340 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29  ==0?_page_ref(P)
14350 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66  :(void)(P)->nRef
14360 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ++).#endif../*.*
14370 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
14380 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
14390 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
143a0 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
143b0 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
143c0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
143d0 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
143e0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
143f0 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65 5f 72   *pPg){.  page_r
14400 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
14410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14420 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
14430 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
14440 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
14450 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
14460 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
14470 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
14480 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
14490 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
144a0 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
144b0 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
144c0 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
144d0 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
144e0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
144f0 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
14500 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
14510 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
14520 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
14530 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
14540 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
14550 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
14560 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
14570 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
14580 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
14590 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
145a0 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
145b0 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
145c0 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
145d0 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
145e0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
145f0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
14600 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
14610 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
14620 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
14630 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
14640 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
14650 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
14660 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
14670 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
14680 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
14690 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
146a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
146b0 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
146c0 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
146d0 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
146e0 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
146f0 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
14700 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
14710 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
14720 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
14730 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
14740 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
14750 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
14760 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
14770 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
14780 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
14790 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
147a0 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f  ilure, so sync o
147b0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ccurs..**.** Thi
147c0 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
147d0 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
147e0 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
147f0 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
14800 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
14810 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
14820 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
14830 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
14840 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
14850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
14860 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
14870 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
14880 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
14890 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
148a0 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
148b0 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
148c0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
148d0 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
148e0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
148f0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
14900 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
14910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14920 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
14930 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   );.      /* ass
14940 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
14950 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
14960 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
14970 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
14980 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
14990 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
149a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
149b0 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
149c0 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
149d0 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
149e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
149f0 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
14a00 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
14a10 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
14a20 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
14a30 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
14a40 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
14a50 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
14a60 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
14a70 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
14a80 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  jSz;.        rc 
14a90 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
14aa0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
14ab0 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
14ac0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
14ad0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
14ae0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
14af0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
14b00 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
14b10 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
14b20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a 20   i64 jrnlOff;.. 
14b30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
14b40 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
14b50 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
14b60 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
14b70 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
14b80 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
14b90 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
14ba0 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
14bb0 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
14bc0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
14bd0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
14be0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
14bf0 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
14c00 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
14c10 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
14c20 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
14c30 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ack. .        */
14c40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
14c50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
14c60 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
14c70 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
14c80 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
14c90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
14ca0 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
14cb0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
14cc0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
14cd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14ce0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
14cf0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
14d00 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
14d10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14d20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e    }..        jrn
14d30 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
14d40 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
14d50 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
14d60 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
14d70 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
14d80 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
14d90 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20   jrnlOff, 4));. 
14da0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
14db0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
14dc0 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50  jfd, jrnlOff, pP
14dd0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
14de0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
14df0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14e00 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
14e10 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
14e20 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
14e30 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
14e40 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
14e50 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
14e60 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  )).      rc = sq
14e70 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
14e80 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
14e90 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20  >full_fsync);.  
14ea0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
14eb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14ec0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14ed0 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
14ee0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
14ef0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
14f00 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e    /* Erase the n
14f10 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f  eedSync flag fro
14f20 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20  m every page..  
14f30 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67    */.    for(pPg
14f40 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
14f50 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
14f60 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
14f70 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
14f80 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
14f90 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
14fa0 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
14fb0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ;.  }..#ifndef N
14fc0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68  DEBUG.  /* If th
14fd0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
14fe0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
14ff0 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65  hen the PgHdr.ne
15000 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  edSync.  ** flag
15010 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
15020 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  ear for all page
15030 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
15040 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69  this.  ** invari
15050 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a  ant is true..  *
15060 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f  /.  else{.    fo
15070 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
15080 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
15090 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
150a0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
150b0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
150c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
150d0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
150e0 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70  ynced==pPager->p
150f0 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e  First );.  }.#en
15100 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
15110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
15120 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61   two lists of pa
15130 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  ges connected by
15140 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70   pDirty and in p
15150 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f  gno order..** Do
15160 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67   not both fixing
15170 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79 20   the pPrevDirty 
15180 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
15190 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65  tic PgHdr *merge
151a0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
151b0 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b  *pA, PgHdr *pB){
151c0 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c  .  PgHdr result,
151d0 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c   *pTail;.  pTail
151e0 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68   = &result;.  wh
151f0 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b  ile( pA && pB ){
15200 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e  .    if( pA->pgn
15210 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  o<pB->pgno ){.  
15220 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
15230 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54  y = pA;.      pT
15240 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20  ail = pA;.      
15250 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b  pA = pA->pDirty;
15260 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15270 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
15280 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69  = pB;.      pTai
15290 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42  l = pB;.      pB
152a0 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20   = pB->pDirty;. 
152b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
152c0 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  A ){.    pTail->
152d0 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d  pDirty = pA;.  }
152e0 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20  else if( pB ){. 
152f0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
15300 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = pB;.  }else{.
15310 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
15320 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
15330 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74  urn result.pDirt
15340 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74  y;.}../*.** Sort
15350 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
15360 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
15370 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20  order by pgno.  
15380 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e  Pages are.** con
15390 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
153a0 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20   pointers.  The 
153b0 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74  pPrevDirty point
153c0 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75  ers are.** corru
153d0 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72  pted by this sor
153e0 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  t..*/.#define N_
153f0 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
15400 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53  C 25.#define N_S
15410 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20  ORT_BUCKET      
15420 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54   25.#ifdef SQLIT
15430 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c  E_TEST.  int sql
15440 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
15450 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20  t_bucket = 0;.  
15460 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55  #undef N_SORT_BU
15470 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e  CKET.  #define N
15480 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20  _SORT_BUCKET \. 
15490 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72    (sqlite3_pager
154a0 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73  _n_sort_bucket?s
154b0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
154c0 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52  ort_bucket:N_SOR
154d0 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a  T_BUCKET_ALLOC).
154e0 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67  #endif.static Pg
154f0 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69  Hdr *sort_pageli
15500 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a  st(PgHdr *pIn){.
15510 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52    PgHdr *a[N_SOR
15520 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c  T_BUCKET_ALLOC],
15530 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
15540 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a  memset(a, 0, siz
15550 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65  eof(a));.  while
15560 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d  ( pIn ){.    p =
15570 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20   pIn;.    pIn = 
15580 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
15590 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
155a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53    for(i=0; i<N_S
155b0 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b  ORT_BUCKET-1; i+
155c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  +){.      if( a[
155d0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
155e0 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20   a[i] = p;.     
155f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
15610 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
15620 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
15630 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20      a[i] = 0;.  
15640 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15650 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55  if( i==N_SORT_BU
15660 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20  CKET-1 ){.      
15670 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20  /* Coverage: To 
15680 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65 20  get here, there 
15690 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f  need to be 2^(N_
156a0 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20  SORT_BUCKET) .  
156b0 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20      ** elements 
156c0 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73  in the input lis
156d0 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73 69  t. This is possi
156e0 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74  ble, but impract
156f0 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ical..      ** T
15700 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65  esting this line
15710 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66   is the point of
15720 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
15730 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
15740 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
15750 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ucket..      */.
15760 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72        a[i] = mer
15770 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
15780 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
15790 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f    p = a[0];.  fo
157a0 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=1; i<N_SORT_
157b0 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20  BUCKET; i++){.  
157c0 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
157d0 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20  list(p, a[i]);. 
157e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
157f0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
15800 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63  list of pages (c
15810 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20  onnected by the 
15820 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
15830 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65  nter) write.** e
15840 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73  very one of thos
15850 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74  e pages out to t
15860 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15870 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61   and mark them a
15880 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a  ll.** as clean..
15890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
158a0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
158b0 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
158c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
158d0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
158e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
158f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15900 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
15910 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
15920 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
15930 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
15940 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
15950 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
15960 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
15970 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
15980 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
15990 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
159a0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
159b0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
159c0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72  lite3OsLock() ar
159d0 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20  e no-ops..  **. 
159e0 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
159f0 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
15a00 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
15a10 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
15a20 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
15a30 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
15a40 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
15a50 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
15a60 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
15a70 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
15a80 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
15a90 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
15aa0 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
15ab0 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
15ac0 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
15ad0 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
15ae0 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
15af0 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
15b00 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
15b10 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
15b20 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
15b30 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
15b40 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
15b50 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
15b60 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
15b70 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
15b80 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
15b90 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
15ba0 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
15bb0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
15bc0 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
15bd0 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
15be0 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
15bf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15c00 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
15c10 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
15c20 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
15c30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15c40 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
15c50 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
15c60 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
15c70 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
15c80 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
15c90 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
15ca0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
15cb0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
15cc0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15cd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
15ce0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
15cf0 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65  List = sort_page
15d00 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 77  list(pList);.  w
15d10 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20  hile( pList ){. 
15d20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
15d30 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 2f  ->dirty );.    /
15d40 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
15d50 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
15d60 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
15d70 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
15d80 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
15d90 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
15da0 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
15db0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
15dc0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
15dd0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
15de0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
15df0 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
15e00 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
15e10 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
15e20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
15e30 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
15e40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
15e50 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
15e60 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
15e70 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
15e80 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
15e90 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
15ea0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68  geSize;.      ch
15eb0 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
15ec0 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C2(pPager, PGHDR
15ed0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
15ee0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
15ef0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
15f00 43 45 34 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE4("STORE %d pa
15f10 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
15f20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15f30 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
15f40 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
15f50 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
15f60 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20  hash(pList));.  
15f70 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
15f80 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
15f90 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
15fa0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
15fb0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
15fc0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
15fd0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15fe0 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ze, offset);.   
15ff0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
16000 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
16010 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
16020 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
16030 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
16040 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
16050 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
16060 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
16070 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
16080 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
16090 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
160a0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
160b0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
160c0 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
160d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
160e0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
160f0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
16100 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
16110 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
16120 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
16130 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16140 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
16150 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16160 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
16170 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
16180 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
16190 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
161a0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
161b0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
161c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
161d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
161e0 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
161f0 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
16200 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
16210 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
16220 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
16230 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
16240 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
16250 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
16260 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
16270 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
16280 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
16290 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
162a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
162b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
162c0 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
162d0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
162e0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
162f0 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
16300 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
16310 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
16320 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
16330 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
16340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
16350 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
16360 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16370 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
16380 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
16390 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
163a0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
163b0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
163c0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
163d0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
163e0 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
163f0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
16400 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
16410 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
16420 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16430 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
16440 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
16450 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  fs;.  if( !pPage
16460 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
16470 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
16480 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73  !sqlite3OsAccess
16490 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
164a0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
164b0 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
164c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
164d0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
164e0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
164f0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  Lock(pPager->fd)
16500 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16510 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
16520 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
16530 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
16540 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
16550 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
16560 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
16570 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16580 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
16590 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
165a0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
165b0 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
165c0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
165d0 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  cycled. .**.** T
165e0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
165f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
16600 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ERR, SQLITE_FULL
16610 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49   or SQLITE_OK. I
16620 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  t .** does not s
16630 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  et the pPager->e
16640 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
16650 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
16660 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67  ager_recycle(Pag
16670 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
16680 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a  syncOk, PgHdr **
16690 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  ppPg){.  PgHdr *
166a0 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30  pPg;.  *ppPg = 0
166b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d  ;..  assert(!MEM
166c0 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  DB);..  /* Find 
166d0 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
166e0 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
166f0 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
16700 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
16710 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
16720 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
16730 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
16740 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
16750 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
16760 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
16770 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
16780 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
16790 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
167a0 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
167b0 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
167c0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
167d0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
167e0 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
167f0 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
16800 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
16810 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
16820 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
16830 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
16840 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
16850 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
16860 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21  t && syncOk && !
16870 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20  MEMDB){.    int 
16880 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
16890 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
168a0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
168b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
168c0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
168d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
168e0 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c      /* If in ful
168f0 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69  l-sync mode, wri
16900 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c  te a new journal
16910 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65   header into the
16920 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
16930 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  l file. This is 
16940 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76  done to avoid ev
16950 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a  er modifying a j
16960 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
16970 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
16980 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
16990 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
169a0 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20   that have.     
169b0 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e   ** already been
169c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
169d0 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73  database (in cas
169e0 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a  e the header is.
169f0 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64        ** trashed
16a00 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   when the nRec f
16a10 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29  ield is updated)
16a20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16a30 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
16a40 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
16a50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16a60 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20  Off > 0 );.     
16a70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16a80 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
16a90 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
16aa0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
16ab0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
16ac0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
16ad0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16ae0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
16af0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
16b00 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  t;.  }.  if( pPg
16b10 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
16b20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16b30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
16b40 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
16b50 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
16b60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16b70 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64   file if it is d
16b80 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irty..  */.  if(
16b90 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
16ba0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
16bb0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
16bc0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d  Sync==0 );.    m
16bd0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
16be0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
16bf0 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
16c00 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
16c10 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
16c20 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
16c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
16c50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16c60 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  }.  assert( pPg-
16c70 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
16c80 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
16c90 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
16ca0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
16cb0 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
16cc0 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67  n.  ** set the g
16cd0 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
16ce0 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
16cf0 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
16d00 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
16d10 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  ontRollback() op
16d20 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
16d30 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
16d40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
16d50 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
16d60 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
16d70 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
16d80 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
16d90 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
16da0 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
16db0 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
16dc0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
16dd0 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
16de0 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
16df0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
16e00 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
16e10 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
16e20 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
16e30 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
16e40 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
16e50 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
16e60 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
16e70 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
16e80 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53  IOTRACE(("ALWAYS
16e90 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c  _ROLLBACK %p\n",
16ea0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50   pPager)).    pP
16eb0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
16ec0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  back = 1;.  }.. 
16ed0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
16ee0 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
16ef0 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
16f00 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
16f10 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28  */.  unlinkPage(
16f20 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pPg);.  assert( 
16f30 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a  pPg->pgno==0 );.
16f40 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
16f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16f60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
16f70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
16f80 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70  lled to free sup
16f90 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63  erfluous dynamic
16fa0 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d  ally allocated m
16fb0 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79  emory.** held by
16fc0 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65   the pager syste
16fd0 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65  m. Memory in use
16fe0 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70   by any SQLite p
16ff0 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  ager allocated.*
17000 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  * by the current
17010 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73   thread may be s
17020 71 6c 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e  qlite3_free()ed.
17030 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74  .**.** nReq is t
17040 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
17050 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71  es of memory req
17060 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73  uired. Once this
17070 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65   much has.** bee
17080 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20  n released, the 
17090 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
170a0 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c  . A negative val
170b0 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e  ue for nReq mean
170c0 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63  s.** free as muc
170d0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
170e0 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e  ible. The return
170f0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f   value is the to
17100 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  tal number .** o
17110 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
17120 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23  y released..*/.#
17130 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
17140 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
17150 4d 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21  MANAGEMENT) && !
17160 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17170 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 69 6e 74 20  MIT_DISKIO).int 
17180 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65  sqlite3PagerRele
17190 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  aseMemory(int nR
171a0 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
171b0 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
171c0 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
171d0 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
171e0 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
171f0 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
17200 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c  /* If the the gl
17210 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65  obal mutex is he
17220 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  ld, this subrout
17230 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20  ine becomes a.  
17240 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79  ** o-op; zero by
17250 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72  tes of memory ar
17260 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69  e freed.  This i
17270 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73  s because.  ** s
17280 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20  ome of the code 
17290 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20  invoked by this 
172a0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73  function may als
172b0 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62  o.  ** try to ob
172c0 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20  tain the mutex, 
172d0 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64  resulting in a d
172e0 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 23 69  eadlock..  */.#i
172f0 66 20 30 0a 20 20 69 66 28 20 73 71 6c 69 74 65  f 0.  if( sqlite
17300 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b  3OsInMutex(0) ){
17310 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
17320 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
17330 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72  Outermost loop r
17340 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20  uns for at most 
17350 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20  two iterations. 
17360 46 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  First iteration 
17370 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66  we.  ** try to f
17380 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ind memory that 
17390 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
173a0 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20  without calling 
173b0 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a  fsync(). Second.
173c0 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28    ** iteration (
173d0 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20  which only runs 
173e0 69 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69  if the first fai
173f0 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71  led to free nReq
17400 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d   bytes of.  ** m
17410 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74  emory) is permit
17420 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e  ted to call fsyn
17430 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20  c(). This is of 
17440 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65  course much more
17450 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65   .  ** expensive
17460 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
17470 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20  ; i<=1; i++){.. 
17480 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
17490 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74  gh all the SQLit
174a0 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20  e pagers opened 
174b0 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
174c0 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61  hread. */.    Pa
174d0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 54  ger *pPager = pT
174e0 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20  sdro->pPager;.  
174f0 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20    for( ; pPager 
17500 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52  && (nReq<0 || nR
17510 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70  eleased<nReq); p
17520 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
17530 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
17540 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
17550 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28  t rc;..      if(
17560 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
17570 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
17580 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f    }..      /* Fo
17590 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72  r each pager, tr
175a0 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e  y to free as man
175b0 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69  y pages as possi
175c0 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20  ble (without .  
175d0 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66      ** calling f
175e0 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69  sync() if this i
175f0 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  s the first iter
17600 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74  ation of the out
17610 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a  ermost .      **
17620 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f   loop)..      */
17630 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51  .      while( SQ
17640 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70  LITE_OK==(rc = p
17650 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
17660 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29 20 26  ger, i, &pPg)) &
17670 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20  & pPg) {.       
17680 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
17690 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
176a0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
176b0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
176c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
176d0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
176e0 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
176f0 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
17700 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20  ed-list .       
17710 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65   ** (pFirstSynce
17720 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20  d). It is still 
17730 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73  in the all pages
17740 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20   (pAll) list. . 
17750 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65         ** Remove
17760 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
17770 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
17780 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g..        **.  
17790 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43        ** Todo: C
177a0 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70  heck the Pager.p
177b0 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b  Stmt list to mak
177c0 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f  e sure this is O
177d0 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a  k. It .        *
177e0 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68  * probably is th
177f0 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ough..        */
17800 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
17810 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  pTmp;.        as
17820 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
17830 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50       if( pPg==pP
17840 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
17850 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
17860 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  >pAll = pPg->pNe
17870 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  xtAll;.        }
17880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17890 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72  for( pTmp=pPager
178a0 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
178b0 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
178c0 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
178d0 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
178e0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
178f0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
17900 20 20 20 20 20 20 20 7d 0a 23 69 66 20 30 0a 20         }.#if 0. 
17910 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
17920 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
17930 69 7a 65 28 70 50 67 29 3b 0a 23 65 6c 73 65 0a  ize(pPg);.#else.
17940 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65          nRelease
17950 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20  d += (.         
17960 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20     sizeof(*pPg) 
17970 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
17980 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2b  ze.            +
17990 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
179a0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
179b0 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
179c0 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
179d0 72 79 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  ry) .        );.
179e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 49  #endif.        I
179f0 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
17a00 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67  %p %d *\n", pPag
17a10 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  er, pPg->pgno));
17a20 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
17a30 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
17a40 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
17a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17a60 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
17a70 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
17a80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17a90 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
17aa0 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
17ab0 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
17ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17ad0 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  or .        ** j
17ae0 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f  ournal in pager_
17af0 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65  recycle(). The e
17b00 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75  rror is not retu
17b10 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20  rned to the .   
17b20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f       ** caller o
17b30 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
17b40 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68   Instead, set th
17b50 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
17b60 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20  variable..      
17b70 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77    ** The error w
17b80 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
17b90 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20  to the user (or 
17ba0 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61  users, in the ca
17bb0 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  se .        ** o
17bc0 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72  f a shared pager
17bd0 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70   cache) of the p
17be0 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  ager for which t
17bf0 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  he error occured
17c00 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17c10 20 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20       assert(.   
17c20 20 20 20 20 20 20 20 20 20 28 72 63 26 30 78 66           (rc&0xf
17c30 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
17c40 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
17c50 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
17c60 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ||.            r
17c70 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20  c==SQLITE_BUSY. 
17c80 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
17c90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17ca0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
17cb0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20  ESERVED );.     
17cc0 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
17cd0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
17ce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
17cf0 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65   return nRelease
17d00 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
17d10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
17d20 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 26  ORY_MANAGEMENT &
17d30 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  & !SQLITE_OMIT_D
17d40 49 53 4b 49 4f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ISKIO */../*.** 
17d50 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
17d60 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74   of page pPg out
17d70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17d80 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
17d90 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
17da0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
17db0 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20  gHdr *pPg, Pgno 
17dc0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pgno){.  int rc;
17dd0 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20  .  i64 offset;. 
17de0 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
17df0 30 20 29 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20  0 );.  offset = 
17e00 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
17e10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17e30 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
17e40 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
17e50 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
17e60 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
17e70 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
17e80 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
17e90 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
17ea0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
17eb0 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
17ec0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
17ed0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
17ee0 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ;.  if( pgno==1 
17ef0 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  ){.    memcpy(&p
17f00 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
17f10 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f  s, &((u8*)PGHDR_
17f20 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34  TO_DATA(pPg))[24
17f30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
17f70 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17f80 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
17f90 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
17fa0 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
17fb0 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41  , 3);.  PAGERTRA
17fc0 43 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61  CE4("FETCH %d pa
17fd0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
17fe0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17ff0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
18000 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
18010 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
18020 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Pg));.  return r
18030 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
18040 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
18050 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  lled to obtain t
18060 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72  he shared lock r
18070 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a  equired before.*
18080 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65  * data may be re
18090 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
180a0 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
180b0 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20  shared lock has 
180c0 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
180d0 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66  obtained, this f
180e0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
180f0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69  op..**.** Immedi
18100 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
18110 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  ining the shared
18120 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72   lock (if requir
18130 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ed), this functi
18140 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72  on.** checks for
18150 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
18160 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  ile. If one is f
18170 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e  ound, an emergen
18180 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69  cy rollback.** i
18190 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65  s performed imme
181a0 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  diately..*/.stat
181b0 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72  ic int pagerShar
181c0 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
181d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
181e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
181f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
18200 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
18210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
18220 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
18230 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28  r->pVfs;.    if(
18240 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
18250 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18260 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
18270 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
18280 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
18290 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
182a0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
182b0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
182c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
182d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
182e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
182f0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
18300 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
18310 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
18320 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18330 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
18340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
18350 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
18360 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
18370 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
18380 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
18390 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
183a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
183b0 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
183c0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
183d0 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
183e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
183f0 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  f( hasHotJournal
18400 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
18410 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
18420 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
18430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18440 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
18450 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a   it is.        *
18460 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
18470 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
18480 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
18490 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
184a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58  he.        ** EX
184b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
184c0 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
184d0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
184e0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  open the.       
184f0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
18500 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
18510 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
18520 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
18530 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
18540 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
18550 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
18560 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
18570 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
18580 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a         ** back..
18590 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
185a0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
185b0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
185c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
185d0 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
185e0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  the.        ** s
185f0 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
18600 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
18610 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
18620 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
18630 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
18640 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  t's own EXCLUSIV
18650 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
18660 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
18670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18680 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
18690 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
186a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
186b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
186c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
186d0 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
186e0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
186f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
18700 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
18710 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  , rc);.        }
18720 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
18730 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
18740 58 43 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20  XCLUSIVE;. .    
18750 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
18760 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
18770 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ing only.  Retur
18780 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  n SQLITE_BUSY if
18790 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61  .        ** we a
187a0 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  re unable to ope
187b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
187c0 6c 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  le. .        **.
187d0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a          ** The j
187e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
187f0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
18800 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20  locked itself.  
18810 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  The.        ** j
18820 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
18830 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73  ever open unless
18840 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
18850 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20  se file holds.  
18860 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65        ** a write
18870 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20   lock, so there 
18880 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61  is never any cha
18890 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  nce of two or mo
188a0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  re.        ** pr
188b0 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20  ocesses opening 
188c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74  the journal at t
188d0 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
188e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
188f0 20 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   ** Open the jou
18900 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
18910 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
18920 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
18930 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75          ** exclu
18940 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
18950 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
18960 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
18970 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
18980 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
18990 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
189a0 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
189b0 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
189c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
189d0 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
189e0 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
189f0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
18a00 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
18a10 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
18a20 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
18a30 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
18a40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18a50 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
18a60 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63  if( sqlite3OsAcc
18a70 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
18a80 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
18a90 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
18aa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
18ab0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
18ac0 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73         int flags
18ad0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
18ae0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
18af0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18b00 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
18b10 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
18b20 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
18b30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18b40 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
18b50 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
18b60 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
18b70 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  s, &fout);.     
18b80 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
18b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
18ba0 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
18bb0 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ods );.         
18bc0 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49 54 45   if( fout&SQLITE
18bd0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
18be0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
18bf0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
18c00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18c10 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
18c20 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
18c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18c40 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18c60 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
18c70 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
18c80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18c90 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
18ca0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
18cb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18cc0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
18cd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
18ce0 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
18cf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18d00 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
18d10 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
18d20 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
18d30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
18d40 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20  dr = 0;. .      
18d50 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
18d60 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
18d70 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
18d80 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
18d90 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61         ** lock a
18da0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
18db0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
18dc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
18dd0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
18de0 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
18df0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18e10 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
18e20 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
18e30 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
18e40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
18e50 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
18e60 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
18e70 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
18e80 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
18e90 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
18ea0 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
18eb0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
18ec0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
18ed0 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
18ee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
18ef0 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
18f00 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
18f10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18f20 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
18f30 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
18f40 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
18f50 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
18f60 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
18f70 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
18f80 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
18f90 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
18fa0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
18fb0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62          ** has b
18fc0 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
18fd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
18fe0 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
18ff0 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  h the.        **
19000 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20   cache..        
19010 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61  **.        ** Da
19020 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
19030 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
19040 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
19050 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
19060 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
19070 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
19080 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
19090 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
190a0 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
190b0 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
190c0 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
190d0 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
190e0 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
190f0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
19100 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
19110 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
19120 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
19130 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65         ** a code
19140 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
19150 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
19160 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
19170 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
19180 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
19190 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
191a0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  e .        ** de
191b0 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
191c0 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
191d0 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
191e0 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
191f0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
19200 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
19210 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19220 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
19230 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
19240 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
19250 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
19260 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
19270 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r);..        if(
19280 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
192a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
192b0 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Code;.        }.
192c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
192d0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
192e0 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
192f0 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
19300 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
19310 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
19320 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
19330 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
19340 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
19350 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
19360 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
19370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
19380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19390 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
193a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
193b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
193c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
193d0 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
193e0 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
193f0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20  eVers));.       
19400 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
19410 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
19420 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
19430 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
19440 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
19450 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
19460 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
19470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19480 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
19490 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
194a0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
194b0 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45  ger->state<=PAGE
194c0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
194d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
194e0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
194f0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
19500 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
19510 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
19520 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
19530 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
19540 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e   a PgHdr object.
19550 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65     Either create
19560 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65   a new one or re
19570 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69  use.** an existi
19580 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e  ng one that is n
19590 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  ot otherwise in 
195a0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  use..**.** A new
195b0 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
195c0 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61   is created if a
195d0 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
195e0 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a  ing are.** true:
195f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
19600 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65  We have not exce
19610 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d  eded our maximum
19620 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65   allocated cache
19630 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20   size.**        
19640 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20    as set by the 
19650 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
19660 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ze" command..**.
19670 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
19680 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20  e are no unused 
19690 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76  PgHdr objects av
196a0 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20  ailable at this 
196b0 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  time..**.**     
196c0 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20  (3)  This is an 
196d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
196e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  se..**.**     (4
196f0 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
19700 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68  PgHdr objects th
19710 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  at do not requir
19720 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  e a journal.**  
19730 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e          file syn
19740 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20  c and a sync of 
19750 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19760 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
19770 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62            prohib
19780 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ited..**.** Othe
19790 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20  rwise, reuse an 
197a0 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20  existing PgHdr. 
197b0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
197c0 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69   reuse an.** exi
197d0 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61  sting PgHdr if a
197e0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
197f0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
19800 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20  .**     (1)  We 
19810 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20  have reached or 
19820 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78  exceeded the max
19830 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a  imum cache size.
19840 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f  **          allo
19850 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63  wed by "PRAGMA c
19860 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a  ache_size"..**.*
19870 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
19880 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69   is a PgHdr avai
19890 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72  lable with PgHdr
198a0 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20  ->nRef==0.**.** 
198b0 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20      (3)  We are 
198c0 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d  not in an in-mem
198d0 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a  ory database.**.
198e0 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68  **     (4)  Eith
198f0 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  er there is an a
19900 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74  vailable PgHdr t
19910 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
19920 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f  d.**          to
19930 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69   be synced to di
19940 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20  sk or else disk 
19950 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65  syncing is curre
19960 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
19970 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61   allowed..*/.sta
19980 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c  tic int pagerAll
19990 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20  ocatePage(Pager 
199a0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
199b0 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  *ppPg){.  int rc
199c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
199d0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
199e0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50  * Create a new P
199f0 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74  gHdr if any of t
19a00 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f  he four conditio
19a10 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a  ns defined .  **
19a20 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a   above is met: *
19a30 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
19a40 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
19a50 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65  Page.   || pPage
19a60 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20  r->pFirst==0 .  
19a70 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20   || MEMDB.   || 
19a80 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  (pPager->pFirstS
19a90 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ynced==0 && pPag
19aa0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20  er->doNotSync). 
19ab0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
19ac0 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65  er->nPage>=pPage
19ad0 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20  r->nHash ){.    
19ae0 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68    pager_resize_h
19af0 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72  ash_table(pPager
19b00 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ,.         pPage
19b10 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32  r->nHash<256 ? 2
19b20 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61  56 : pPager->nHa
19b30 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28  sh*2);.      if(
19b40 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d   pPager->nHash==
19b50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
19b60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
19b70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
19b80 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
19b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19ba0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
19bb0 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
19bc0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
19bd0 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
19be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bf0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
19c00 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
19c10 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c30 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
19c40 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
19c50 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
19c60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19c70 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
19c80 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
19c90 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
19ca0 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
19cb0 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
19cc0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
19cd0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
19ce0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
19cf0 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
19d00 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
19d10 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
19d20 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
19d30 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
19d40 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
19d50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41  ;.    pPager->pA
19d60 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  ll = pPg;.    pP
19d70 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20  ager->nPage++;. 
19d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
19d90 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69  ecycle an existi
19da0 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20 7a  ng page with a z
19db0 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a  ero ref-count. *
19dc0 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
19dd0 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
19de0 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69   1, &pPg);.    i
19df0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
19e00 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  SY ){.      rc =
19e10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
19e20 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  OCKED;.    }.   
19e30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19e40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
19e50 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
19e60 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
19e70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
19e80 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
19e90 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
19ea0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
19eb0 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
19ec0 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
19ed0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19ee0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
19ef0 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e   have the conten
19f00 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
19f10 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  f the page was.*
19f20 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  * previously acq
19f30 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
19f40 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68  tent==1, then th
19f50 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a  e content was.**
19f60 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   just initialize
19f70 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65  d to zeros inste
19f80 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ad of being read
19f90 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42   from disk..** B
19fa0 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74  ut now we need t
19fb0 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66  he real data off
19fc0 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61   of disk.  So ma
19fd0 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61  ke sure we.** ha
19fe0 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20  ve it.  Read it 
19ff0 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  in if we do not 
1a000 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e  have it already.
1a010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a020 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1a030 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1a040 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  if( pPg->needRea
1a050 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  d ){.    int rc 
1a060 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1a070 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
1a080 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1a090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a0a0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   ){.      pPg->n
1a0b0 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1a0c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1a0d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a0e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1a0f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1a100 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
1a110 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
1a120 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
1a130 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
1a140 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
1a150 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
1a160 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
1a170 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
1a180 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
1a190 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
1a1a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a1b0 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
1a1c0 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
1a1d0 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
1a1e0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1a1f0 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
1a200 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1a210 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
1a220 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
1a230 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
1a240 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
1a250 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
1a260 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
1a270 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
1a280 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
1a290 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
1a2a0 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
1a2b0 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
1a2c0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1a2d0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
1a2e0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
1a2f0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
1a300 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
1a310 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
1a320 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
1a330 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
1a340 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
1a350 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1a360 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1a370 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
1a380 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
1a390 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
1a3a0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
1a3b0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
1a3c0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
1a3d0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
1a3e0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
1a3f0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
1a400 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1a410 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
1a420 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
1a430 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
1a440 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
1a450 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
1a460 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
1a470 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
1a480 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
1a490 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
1a4a0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
1a4b0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
1a4c0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
1a4d0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
1a4e0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
1a4f0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
1a500 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
1a510 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
1a520 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
1a530 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
1a540 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
1a550 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
1a560 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
1a570 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
1a580 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
1a590 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
1a5a0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
1a5b0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
1a5c0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1a5d0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
1a5e0 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
1a5f0 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
1a600 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
1a610 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
1a620 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
1a630 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
1a640 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
1a650 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
1a660 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
1a670 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
1a680 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1a690 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
1a6a0 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
1a6b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a6c0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
1a6d0 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
1a6e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
1a6f0 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
1a700 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
1a710 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
1a720 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
1a730 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
1a740 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
1a750 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
1a760 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
1a770 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
1a780 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
1a790 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
1a7a0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
1a7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a7c0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
1a7d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1a7e0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
1a7f0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
1a800 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
1a810 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
1a820 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
1a830 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
1a840 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
1a850 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
1a860 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
1a870 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
1a880 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1a890 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1a8a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a8b0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1a8c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
1a8d0 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
1a8e0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
1a8f0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
1a900 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
1a910 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1a920 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
1a930 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1a940 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
1a950 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
1a960 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
1a970 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
1a980 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
1a990 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1a9a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
1a9b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1a9c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1a9d0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
1a9e0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
1a9f0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
1aa00 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
1aa10 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1aa20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
1aa30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1aa40 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1aa50 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1aa60 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
1aa70 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1aa80 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
1aa90 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1aaa0 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
1aab0 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
1aac0 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
1aad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aae0 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
1aaf0 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1ab00 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
1ab10 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
1ab20 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
1ab30 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
1ab40 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
1ab50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ab60 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1ab70 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1ab80 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ab90 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1aba0 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
1abb0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1abc0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1abd0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
1abe0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1abf0 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
1ac00 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1ac10 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
1ac20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45   int h;.    PAGE
1ac30 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1ac40 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  Miss);.    rc = 
1ac50 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
1ac60 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b  e(pPager, &pPg);
1ac70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ac80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ac90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1aca0 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  ..    pPg->pgno 
1acb0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  = pgno;.    asse
1acc0 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67  rt( !MEMDB || pg
1acd0 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  no>pPager->stmtS
1ace0 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
1acf0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ad00 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
1ad10 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ad20 7a 65 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20  ze ){.#if 0.    
1ad30 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
1ad40 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
1ad50 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
1ad60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61  ;.#endif.      a
1ad70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1ad80 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
1ad90 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1ada0 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
1adb0 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
1adc0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
1add0 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
1ade0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1adf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ae00 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1ae10 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
1ae20 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
1ae30 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61   }..    makeClea
1ae40 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
1ae50 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
1ae60 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
1ae70 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
1ae80 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1ae90 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
1aea0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
1aeb0 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
1aec0 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
1aed0 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
1aee0 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c  }.    nMax = sql
1aef0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1af00 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
1af10 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1af20 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
1af30 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1af40 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg);.      rc = 
1af50 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1af60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1af70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1af80 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67  Populate the pag
1af90 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74  e with data, eit
1afa0 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66  her by reading f
1afb0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1afc0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72  .    ** file, or
1afd0 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
1afe0 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a  entire page to z
1aff0 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
1b000 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67  if( nMax<(int)pg
1b010 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28  no || MEMDB || (
1b020 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
1b030 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1b040 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 69  back) ){.      i
1b050 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
1b060 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
1b070 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1b080 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1b090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b0a0 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  FULL;.      }.  
1b0b0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
1b0c0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
1b0d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1b0e0 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ze);.      pPg->
1b0f0 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e  needRead = noCon
1b100 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  tent && !pPager-
1b110 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b  >alwaysRollback;
1b120 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1b130 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
1b140 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1b150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b160 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1b170 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67  (pPager, pPg, pg
1b180 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1b190 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1b1a0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1b1b0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1b1c0 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
1b1d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
1b1e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1b1f0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
1b200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1b210 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1b220 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Read = 0;.    }.
1b230 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  .    /* Link the
1b240 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
1b250 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  age hash table *
1b260 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26  /.    h = pgno &
1b270 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
1b280 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
1b290 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70  pgno!=0 );.    p
1b2a0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
1b2b0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1b2c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
1b2d0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
1b2e0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
1b2f0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
1b300 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
1b310 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
1b320 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
1b330 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
1b340 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
1b350 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1b360 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1b370 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
1b380 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1b390 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
1b3a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1b3b0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
1b3c0 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20   is in the page 
1b3d0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73  cache. */.    as
1b3e0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65  sert(pPager->nRe
1b3f0 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b  f>0 || pgno==1);
1b400 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
1b410 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
1b420 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e     if( !noConten
1b430 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
1b440 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
1b450 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  t(pPg);.      if
1b460 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1b470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b480 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
1b490 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
1b4a0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
1b4b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b4c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
1b4d0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
1b4e0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
1b4f0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1b500 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
1b510 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
1b520 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
1b530 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1b540 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
1b550 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1b560 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
1b570 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1b580 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
1b590 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1b5a0 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
1b5b0 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
1b5c0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
1b5d0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
1b5e0 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
1b5f0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
1b600 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
1b610 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1b620 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
1b630 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1b640 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
1b650 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1b660 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
1b670 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
1b680 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
1b690 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
1b6a0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
1b6b0 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
1b6c0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1b6d0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1b6e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
1b6f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1b700 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28  gno!=0 );..  if(
1b710 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1b720 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
1b730 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
1b740 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61  ger->pAll || pPa
1b750 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1b760 64 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  de );.    return
1b770 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
1b780 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
1b790 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b7a0 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
1b7b0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b7c0 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
1b7d0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1b7e0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
1b7f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1b800 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
1b810 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
1b820 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
1b830 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
1b840 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1b850 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1b860 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
1b870 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
1b880 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
1b890 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
1b8a0 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
1b8b0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
1b8c0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
1b8d0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
1b8e0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
1b8f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b900 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
1b910 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1b920 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
1b930 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63  *pPg){..  /* Dec
1b940 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
1b950 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
1b960 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
1b970 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1b980 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
1b990 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
1b9a0 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
1b9b0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
1b9c0 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
1b9d0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
1b9e0 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
1b9f0 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
1ba00 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
1ba10 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
1ba20 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
1ba30 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
1ba40 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
1ba50 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
1ba60 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1ba70 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
1ba80 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
1ba90 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
1baa0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
1bab0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
1bac0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
1bad0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
1bae0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
1baf0 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
1bb00 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
1bb10 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
1bb20 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
1bb30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1bb40 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
1bb50 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
1bb60 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
1bb70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
1bb80 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
1bb90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1bba0 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
1bbb0 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
1bbc0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
1bbd0 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
1bbe0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
1bbf0 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
1bc00 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
1bc10 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
1bc20 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
1bc30 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
1bc40 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
1bc50 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
1bc60 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
1bc70 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
1bc80 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
1bc90 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
1bca0 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
1bcb0 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
1bcc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
1bcd0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
1bce0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
1bcf0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1bd00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1bd10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1bd20 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e  * Create a journ
1bd30 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  al file for pPag
1bd40 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c  er.  There shoul
1bd50 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  d already be a R
1bd60 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58  ESERVED.** or EX
1bd70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1bd80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1bd90 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1bda0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
1bdb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1bdc0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
1bdd0 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ing.  Return an 
1bde0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72  error code and r
1bdf0 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72  elease the.** wr
1be00 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74  ite lock if anyt
1be10 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
1be20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1be30 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1be40 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1be50 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1be60 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1be70 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67  pVfs;.  int flag
1be80 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
1be90 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1bea0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1beb0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
1bec0 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b  ATE);..  int rc;
1bed0 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
1bee0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1bef0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1bf00 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1bf10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bf20 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1bf30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1bf40 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1bf50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1bf60 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1bf70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1bf80 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1bf90 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
1bfa0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1bfb0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1bfc0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1bfd0 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
1bfe0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1bff0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
1c000 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1c010 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1c020 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1c030 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1c040 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1c050 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51      flags |= (SQ
1c060 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1c070 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
1c080 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1c090 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c0a0 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
1c0b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1c0c0 41 4c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  AL);.  }.  rc = 
1c0d0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1c0e0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1c0f0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1c100 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  d, flags, 0);.  
1c110 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1c120 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
1c130 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  >jfd->pMethods )
1c140 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
1c150 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
1c160 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1c170 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 0;.  pPager->j
1c180 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
1c190 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c1a0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
1c1b0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
1c1c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
1c1d0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
1c1e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1c1f0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  0);.    }.    go
1c200 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1c210 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 23  n_journal;.  }.#
1c220 69 66 20 30 0a 20 20 73 71 6c 69 74 65 33 4f 73  if 0.  sqlite3Os
1c230 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
1c240 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1c250 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20  >full_fsync);.  
1c260 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
1c270 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
1c280 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
1c290 79 6e 63 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  ync);.#endif.  p
1c2a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1c2b0 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  en = 1;.  pPager
1c2c0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1c2d0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1c2e0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1c2f0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1c300 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50  llback = 0;.  pP
1c310 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
1c320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1c330 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
1c340 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1c350 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  e;.    goto fail
1c360 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1c370 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
1c380 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1c390 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
1c3a0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1c3b0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1c3c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1c3d0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
1c3e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c3f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c400 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  PagerStmtBegin(p
1c410 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
1c420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c430 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
1c440 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MEM ){.    rc = 
1c450 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1c460 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
1c470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1c490 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1c4a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c4b0 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
1c4c0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
1c4d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c4e0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1c4f0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  l);.  pPager->aI
1c500 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1c510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c520 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
1c530 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1c540 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
1c550 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
1c560 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
1c570 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1c580 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
1c590 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  *  sqlite3PagerC
1c5a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1c5b0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
1c5c0 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  *  sqlite3PagerR
1c5d0 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
1c5e0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1c5f0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
1c600 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
1c610 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1c620 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  Unref() is calle
1c630 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
1c640 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
1c650 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1c660 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
1c670 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
1c680 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
1c690 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
1c6a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
1c6b0 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
1c6c0 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
1c6d0 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
1c6e0 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
1c6f0 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
1c700 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1c710 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
1c720 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
1c730 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
1c740 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1c750 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
1c760 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1c770 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
1c780 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
1c790 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
1c7a0 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
1c7b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
1c7c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1c7d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
1c7e0 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
1c7f0 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
1c800 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
1c810 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
1c820 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1c830 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
1c840 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
1c850 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
1c860 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
1c870 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
1c880 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
1c890 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
1c8a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
1c8b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
1c8c0 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1c8d0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
1c8e0 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
1c8f0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1c900 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
1c910 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
1c920 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
1c930 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1c940 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
1c950 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
1c960 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
1c970 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
1c980 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
1c990 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
1c9a0 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
1c9b0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
1c9c0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
1c9d0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1c9e0 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69  n(DbPage *pPg, i
1c9f0 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61  nt exFlag){.  Pa
1ca00 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1ca10 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1ca20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ca30 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1ca40 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
1ca50 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ca60 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1ca70 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1ca80 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
1ca90 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
1caa0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1cab0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
1cac0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1cad0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1cae0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1caf0 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
1cb00 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1cb10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1cb20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cb30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
1cb40 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
1cb50 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
1cb60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1cb70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cb80 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1cb90 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
1cba0 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
1cbb0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
1cbc0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1cbd0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1cbe0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1cbf0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
1cc00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1cc10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cc20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1cc30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1cc40 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1cc50 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ache = 0;.      
1cc60 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41  PAGERTRACE2("TRA
1cc70 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
1cc80 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1cc90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1cca0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
1ccb0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
1ccc0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
1ccd0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
1cce0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1ccf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cd00 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1cd10 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
1cd20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cd30 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Off==0 ){.    /*
1cd40 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1cd50 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73  en the pager was
1cd60 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
1cd70 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20  cess mode last. 
1cd80 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
1cd90 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
1cda0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
1cdb0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
1cdc0 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
1cdd0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
1cde0 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
1cdf0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
1ce00 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
1ce10 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
1ce20 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20   truncated to 0 
1ce30 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  bytes..    */.  
1ce40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ce50 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
1ce60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ce70 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29  >origDbSize==0 )
1ce80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ce90 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1cea0 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
1ceb0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1cec0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1ced0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1cee0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1cef0 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62  Zero( pPager->db
1cf00 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
1cf10 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61    if( !pPager->a
1cf20 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  InJournal ){.   
1cf30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1cf40 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1cf50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1cf60 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1cf70 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1cf80 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1cf90 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1cfa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1cfb0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  rt( !pPager->jou
1cfc0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
1cfd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
1cfe0 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
1cff0 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  K );.  return rc
1d000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1d010 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53  a page dirty.  S
1d020 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61  et its dirty fla
1d030 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20  g and add it to 
1d040 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67  the dirty.** pag
1d050 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1d060 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79  c void makeDirty
1d070 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1d080 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  if( pPg->dirty==
1d090 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
1d0a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1d0b0 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64  ager;.    pPg->d
1d0c0 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  irty = 1;.    pP
1d0d0 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
1d0e0 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  er->pDirty;.    
1d0f0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72  if( pPager->pDir
1d100 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ty ){.      pPag
1d110 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  er->pDirty->pPre
1d120 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  vDirty = pPg;.  
1d130 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72    }.    pPg->pPr
1d140 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  evDirty = 0;.   
1d150 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1d160 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
1d170 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
1d180 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74  clean.  Clear it
1d190 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20  s dirty bit and 
1d1a0 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
1d1b0 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
1d1c0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1d1d0 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
1d1e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
1d1f0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
1d200 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
1d210 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67  = 0;.    if( pPg
1d220 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
1d230 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70    pPg->pDirty->p
1d240 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d  PrevDirty = pPg-
1d250 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20  >pPrevDirty;.   
1d260 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
1d270 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20  pPrevDirty ){.  
1d280 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
1d290 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  rty->pDirty = pP
1d2a0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
1d2b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
1d2c0 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20  >pPager->pDirty 
1d2d0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1d2e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
1d2f0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
1d300 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
1d310 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
1d320 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1d330 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
1d340 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1d350 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
1d360 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
1d370 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
1d380 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
1d390 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
1d3a0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
1d3b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d3c0 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
1d3d0 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
1d3e0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
1d3f0 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
1d400 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1d410 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
1d420 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
1d430 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
1d440 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
1d450 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1d460 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
1d470 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1d480 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
1d490 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
1d4a0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
1d4b0 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
1d4c0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
1d4d0 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
1d4e0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1d4f0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
1d500 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d510 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
1d520 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
1d530 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
1d540 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
1d550 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1d560 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
1d570 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
1d580 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
1d590 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
1d5a0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
1d5b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1d5c0 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
1d5d0 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
1d5e0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
1d5f0 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  ) or sqlite3Page
1d600 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  rRollback() to.*
1d610 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  * reset..*/.stat
1d620 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1d630 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
1d640 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
1d650 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1d660 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g);.  Pager *pPa
1d670 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1d680 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1d690 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
1d6a0 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
1d6b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1d6c0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20  r->errCode ){ . 
1d6d0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1d6e0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1d6f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
1d700 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
1d710 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
1d720 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1d730 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1d740 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
1d750 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
1d760 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61 73  If this page was
1d770 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
1d780 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
1d790 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61  ent==1, that mea
1d7a0 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27  ns.  ** we didn'
1d7b0 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e  t really read in
1d7c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1d7d0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
1d7e0 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20  can happen.  ** 
1d7f0 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68  (for example) wh
1d800 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
1d810 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68  eing moved to th
1d820 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74  e freelist.  But
1d830 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65  .  ** now we are
1d840 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e   (perhaps) movin
1d850 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f  g the page off o
1d860 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 66  f the freelist f
1d870 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e  or.  ** reuse an
1d880 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  d we need to kno
1d890 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  w its original c
1d8a0 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63  ontent so that c
1d8b0 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20  ontent.  ** can 
1d8c0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
1d8d0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1d8e0 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65  l.  So do the re
1d8f0 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ad at this.  ** 
1d900 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  time..  */.  rc 
1d910 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
1d920 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20  ent(pPg);.  if( 
1d930 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1d940 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   rc;.  }..  /* M
1d950 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1d960 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
1d970 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
1d980 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
1d990 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
1d9a0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
1d9b0 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
1d9c0 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79    */.  makeDirty
1d9d0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67  (pPg);.  if( pPg
1d9e0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1d9f0 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
1da00 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  pPg) || pPager->
1da10 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  stmtInUse==0) ){
1da20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
1da30 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d  tyCache = 1;.  }
1da40 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
1da50 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
1da60 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1da70 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
1da80 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
1da90 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
1daa0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
1dab0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
1dac0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1dad0 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
1dae0 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
1daf0 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
1db00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1db10 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
1db20 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
1db30 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
1db40 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
1db50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1db60 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1db70 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
1db80 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1db90 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  pPg, 0);.    if(
1dba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dbb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1dbc0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
1dbd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1dbe0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1dbf0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
1dc00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1dc10 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
1dc20 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
1dc30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
1dc40 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
1dc50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1dc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1dc70 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1dc80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1dc90 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
1dca0 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
1dcb0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
1dcc0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1dcd0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
1dce0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1dcf0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
1dd00 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
1dd10 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
1dd20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1dd30 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
1dd40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1dd50 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
1dd60 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
1dd70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1dd80 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
1dd90 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
1dda0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
1ddb0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
1ddc0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
1ddd0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
1dde0 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
1ddf0 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
1de00 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
1de10 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
1de20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
1de30 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1de40 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
1de50 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1de60 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1de70 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1de80 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1de90 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
1dea0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1deb0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1dec0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  no);.          a
1ded0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
1dee0 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
1def0 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
1df00 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1df10 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
1df20 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
1df30 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
1df40 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
1df50 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
1df60 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Orig, PGHDR_TO_D
1df70 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
1df80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1df90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dfa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dfb0 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76    u32 cksum, sav
1dfc0 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ed;.          ch
1dfd0 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e  ar *pData2, *pEn
1dfe0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;.          /* 
1dff0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
1e000 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
1e010 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
1e020 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
1e030 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
1e040 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
1e050 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1e060 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
1e070 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
1e080 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
1e090 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e0a0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
1e0b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1e0c0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
1e0d0 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
1e0e0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1e0f0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
1e100 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
1e110 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
1e120 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
1e130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e  );.          pEn
1e140 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61  d = pData2 + pPa
1e150 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1e160 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
1e170 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  -= 4;.          
1e180 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70  saved = *(u32*)p
1e190 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  End;.          p
1e1a0 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63  ut32bits(pEnd, c
1e1b0 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
1e1c0 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e   szPg = pPager->
1e1d0 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
1e1e0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1e1f0 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e  pData2, pPg->pgn
1e200 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
1e210 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1e220 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
1e230 44 61 74 61 32 2c 20 73 7a 50 67 2c 20 70 50 61  Data2, szPg, pPa
1e240 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1e250 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
1e260 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
1e270 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
1e280 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  ger, pPg->pgno,.
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1e2b0 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 3b 0a 20  alOff, szPg));. 
1e2c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49           PAGER_I
1e2d0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1e2e0 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
1e2f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1e300 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
1e310 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20   szPg;.         
1e320 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4a 4f   PAGERTRACE5("JO
1e330 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1e340 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
1e350 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1e360 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1e370 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1e380 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
1e390 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61 67 65  Sync, pager_page
1e3a0 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 20 20  hash(pPg));.    
1e3b0 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45 6e        *(u32*)pEn
1e3c0 64 20 3d 20 73 61 76 65 64 3b 0a 0a 20 20 20 20  d = saved;..    
1e3d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
1e3e0 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72  r has occured wr
1e3f0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
1e400 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
1e410 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61            ** tra
1e420 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
1e430 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20   rolled back by 
1e440 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e  the layer above.
1e450 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1e460 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e480 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1e490 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
1e4a0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1e4b0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
1e4c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1e4d0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
1e4e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1e4f0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1e500 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
1e510 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1e520 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
1e530 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
1e540 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
1e550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
1e560 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1e570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e580 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1e590 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1e5a0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1e5b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1e5d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
1e5e0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
1e5f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1e600 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
1e610 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
1e620 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50  PAGERTRACE4("APP
1e630 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
1e640 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1e660 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1e670 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1e680 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
1e690 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
1e6a0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1e6b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
1e6c0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1e6d0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
1e6e0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1e6f0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
1e700 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1e710 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
1e720 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
1e730 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
1e740 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
1e750 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
1e760 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1e770 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
1e780 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
1e790 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
1e7a0 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
1e7b0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
1e7c0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
1e7d0 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
1e7e0 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
1e7f0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
1e800 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
1e810 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1e820 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20 21  InUse .     && !
1e830 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
1e840 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28 69  pPg) .     && (i
1e850 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
1e860 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
1e870 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
1e880 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
1e890 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
1e8a0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
1e8b0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
1e8c0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1e8d0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1e8e0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1e8f0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1e900 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
1e910 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
1e920 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
1e930 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
1e940 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1e950 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e960 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1e970 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
1e980 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1e990 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
1e9a0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1e9b0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1e9c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
1e9d0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1e9e0 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1e9f0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1ea00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1ea10 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1ea20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1ea30 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1ea40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ea50 20 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65         i64 offse
1ea60 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
1ea70 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  NRec*(4+pPager->
1ea80 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1ea90 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
1eaa0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1eab0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1eac0 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20  o, 7)-4;.       
1ead0 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61   put32bits(pData
1eae0 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  2, pPg->pgno);. 
1eaf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1eb00 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1eb10 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c  r->stfd, pData2,
1eb20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1eb30 65 2b 34 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  e+4, offset);.  
1eb40 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1eb50 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1eb60 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1eb70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1eb80 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1eb90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1eba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ebb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ebc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ebd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1ebe0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
1ebf0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1ec00 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
1ec10 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1ec20 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1ec30 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1ec40 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  7);.      }.    
1ec50 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1ec60 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1ec70 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1ec80 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ec90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1eca0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1ecb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1ecc0 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
1ecd0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1ece0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
1ecf0 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
1ed00 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1ed10 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
1ed20 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
1ed30 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
1ed40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
1ed50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ed60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ed70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ed80 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61  s used to mark a
1ed90 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72   data-page as wr
1eda0 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20  itable. It uses 
1edb0 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28  .** pager_write(
1edc0 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72  ) to open a jour
1edd0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20  nal file (if it 
1ede0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1edf0 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74  pen).** and writ
1ee00 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74  e the page *pDat
1ee10 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  a to the journal
1ee20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
1ee30 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1ee40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
1ee50 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
1ee60 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
1ee70 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
1ee80 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
1ee90 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
1eea0 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
1eeb0 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
1eec0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
1eed0 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
1eee0 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
1eef0 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
1ef00 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1ef10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ef20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1ef30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ef40 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
1ef50 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
1ef60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ef70 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
1ef80 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
1ef90 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1efa0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
1efb0 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
1efc0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
1efd0 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
1efe0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
1eff0 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
1f000 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
1f010 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
1f020 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
1f030 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1f040 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1f050 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
1f060 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
1f070 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1f080 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1f090 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1f0a0 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
1f0b0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
1f0c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f0d0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
1f0e0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
1f0f0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
1f100 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74   ii;..    /* Set
1f110 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1f120 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1f130 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1f140 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1f150 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1f160 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1f170 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1f180 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1f190 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1f1a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1f1b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1f1c0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
1f1d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1f1e0 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
1f1f0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
1f200 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
1f210 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
1f220 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
1f230 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
1f240 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
1f250 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
1f260 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
1f270 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1f280 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1f290 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1f2a0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
1f2b0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
1f2c0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
1f2d0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
1f2e0 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
1f2f0 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
1f300 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1f310 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
1f320 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
1f330 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1f340 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
1f350 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
1f360 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
1f370 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
1f380 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1f390 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
1f3a0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
1f3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
1f3c0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
1f3d0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
1f3e0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
1f3f0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
1f400 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
1f410 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
1f420 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
1f430 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1f440 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
1f450 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
1f460 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
1f470 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69   pg1+ii;.      i
1f480 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
1f490 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50  ournal || pg==pP
1f4a0 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20  g->pgno || .    
1f4b0 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d        pg>pPager-
1f4c0 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21  >origDbSize || !
1f4d0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1f4e0 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70  nal[pg/8]&(1<<(p
1f4f0 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b  g&7))).      ) {
1f500 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
1f510 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1f520 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1f530 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
1f540 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f550 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1f560 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
1f570 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f590 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1f5a0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1f5b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
1f5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f5d0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1f5e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f5f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f600 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1f610 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1f620 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
1f630 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1f640 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1f650 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1f660 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
1f670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f680 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1f690 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
1f6a0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1f6b0 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
1f6c0 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
1f6d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f6e0 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
1f6f0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
1f700 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
1f710 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
1f720 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1f730 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
1f740 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1f750 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1f760 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
1f770 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
1f780 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  rty;.}.#endif..#
1f790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f7a0 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
1f7b0 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
1f7c0 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
1f7d0 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
1f7e0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1f7f0 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
1f800 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1f810 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65  e3PagerOverwrite
1f820 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f830 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
1f840 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
1f850 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
1f860 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f870 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1f880 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20   pgno, &pPg);.  
1f890 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f8a0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1f8b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f8c0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1f8d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f8e0 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69       memcpy(sqli
1f8f0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
1f900 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61  pPg), pData, pPa
1f910 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f920 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f930 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1f940 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f950 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1f960 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1f970 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1f980 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1f990 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1f9a0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
1f9b0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
1f9c0 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
1f9d0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
1f9e0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
1f9f0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
1fa00 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
1fa10 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1fa20 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1fa30 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1fa40 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1fa50 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1fa60 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1fa70 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1fa80 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1fa90 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1faa0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1fab0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1fac0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1fad0 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1fae0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1faf0 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1fb00 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
1fb10 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1fb20 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1fb30 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1fb40 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1fb50 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1fb60 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1fb70 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1fb80 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1fb90 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1fba0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1fbb0 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1fbc0 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1fbd0 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1fbe0 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1fbf0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1fc00 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
1fc10 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
1fc20 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
1fc30 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1fc40 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1fc50 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1fc60 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1fc70 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1fc80 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1fc90 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1fca0 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1fcb0 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1fcc0 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1fcd0 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1fce0 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1fcf0 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1fd00 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1fd10 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1fd20 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1fd30 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1fd40 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1fd50 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1fd60 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1fd70 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
1fd80 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1fd90 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1fda0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1fdb0 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
1fdc0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
1fdd0 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1fde0 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1fdf0 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
1fe00 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
1fe10 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
1fe20 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1fe30 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1fe40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1fe50 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50  gerDontWrite(DbP
1fe60 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
1fe70 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
1fe80 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
1fe90 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1fea0 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  ager;..  if( MEM
1feb0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  DB ) return;.  p
1fec0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1fed0 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
1fee0 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61  g->dirty && !pPa
1fef0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1ff00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1ff10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1ff20 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
1ff30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1ff40 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
1ff50 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
1ff60 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
1ff70 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
1ff80 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
1ff90 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
1ffa0 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
1ffb0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
1ffc0 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
1ffd0 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
1ffe0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
1fff0 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
20000 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
20010 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
20020 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20030 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
20040 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
20050 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
20060 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
20070 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
20080 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
20090 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
200a0 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
200b0 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
200c0 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
200d0 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
200e0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
200f0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
20100 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
20110 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
20120 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
20130 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
20140 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
20150 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
20160 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
20170 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
20180 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
20190 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
201a0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
201b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
201c0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
201d0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
201e0 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
201f0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
20200 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ).      makeClea
20210 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53  n(pPg);.#ifdef S
20220 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
20230 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
20240 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
20250 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
20260 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
20270 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
20280 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
20290 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
202a0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
202b0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
202c0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
202d0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
202e0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
202f0 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
20300 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
20310 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
20320 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
20330 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
20340 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
20350 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
20360 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
20370 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
20380 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
20390 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
203a0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
203b0 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
203c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
203d0 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
203e0 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
203f0 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
20400 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
20410 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
20420 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
20430 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
20440 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
20450 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
20460 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
20470 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
20480 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
20490 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
204a0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
204b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
204c0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
204d0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
204e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
204f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
20500 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
20510 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
20520 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
20530 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
20540 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
20550 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
20560 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
20570 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
20580 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
20590 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
205a0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
205b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
205c0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
205d0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
205e0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
205f0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70  urnal = 1;.    p
20600 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30  Pg->needRead = 0
20610 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
20620 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
20630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
20640 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
20650 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
20660 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20  no&7);.    }.   
20670 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
20680 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
20690 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
206a0 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
206b0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49  (pPager));.    I
206c0 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45  OTRACE(("GARBAGE
206d0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
206e0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
206f0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
20700 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26  >stmtInUse .   &
20710 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
20720 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26 20 28  nt(pPg) .   && (
20730 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
20740 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
20750 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
20760 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
20770 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
20780 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
20790 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
207a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
207b0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Stmt!=0 );.    p
207c0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
207d0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
207e0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
207f0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
20800 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
20810 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
20820 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
20830 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
20840 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
20850 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
20860 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
20870 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20880 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
20890 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
208a0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
208b0 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
208c0 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
208d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
208e0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
208f0 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
20900 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
20910 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
20920 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
20930 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
20940 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
20950 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
20960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
20970 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
20980 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20990 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
209a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
209b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
209c0 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65   .    /* Increme
209d0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
209e0 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
209f0 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
20a00 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
20a10 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
20a20 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
20a30 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
20a40 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67  Vers);.    chang
20a50 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
20a60 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
20a70 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
20a80 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
20a90 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
20aa0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
20ab0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
20ac0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
20ad0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
20ae0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
20af0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
20b00 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
20b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20b20 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
20b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
20b40 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
20b50 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
20b60 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
20b70 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
20b80 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
20b90 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
20ba0 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
20bb0 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
20bc0 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
20bd0 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
20be0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
20bf0 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
20c00 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
20c10 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
20c20 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
20c30 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
20c40 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
20c50 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
20c60 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
20c70 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
20c80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20c90 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
20ca0 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
20cb0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
20cc0 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
20cd0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
20ce0 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
20cf0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
20d00 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
20d10 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
20d20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
20d30 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
20d40 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
20d50 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
20d60 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
20d70 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
20d80 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
20d90 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
20da0 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
20db0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
20dc0 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
20dd0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
20de0 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
20df0 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
20e00 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
20e10 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
20e20 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
20e30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20e40 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
20e50 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ne(Pager *pPager
20e60 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
20e70 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
20e80 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
20e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41  SQLITE_OK;..  PA
20ea0 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42  GERTRACE4("DATAB
20eb0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
20ec0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
20ed0 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
20ee0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
20ef0 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
20f00 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
20f10 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
20f20 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
20f30 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
20f40 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
20f50 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
20f60 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
20f70 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
20f80 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
20f90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
20fa0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
20fb0 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
20fc0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
20fd0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
20fe0 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
20ff0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21000 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
21010 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
21020 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
21030 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
21040 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
21050 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
21060 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
21070 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
21080 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
21090 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
210a0 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
210b0 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
210c0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
210d0 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
210e0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
210f0 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
21100 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
21110 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
21120 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
21130 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
21140 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
21150 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
21160 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
21170 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
21180 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
21190 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
211a0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
211b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
211c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
211d0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
211e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
211f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
21200 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
21210 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
21220 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
21230 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
21240 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
21250 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
21260 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
21270 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
21280 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
21290 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
212a0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
212b0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
212c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
212d0 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69  gno i;.        i
212e0 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
212f0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
21300 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
21310 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
21320 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
21330 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
21340 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
21350 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
21360 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
21370 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
21380 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21390 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
213a0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b  Pager, i, &pPg);
213b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
213c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
213d0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
213e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
213f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
21400 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ite(pPg);.      
21410 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
21420 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
21430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
21450 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
21460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21470 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e    } .      }.#en
21480 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77  dif.      rc = w
21490 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
214a0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
214b0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
214c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
214d0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
214e0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
214f0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
21500 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21510 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
21520 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23  c_exit;.    }..#
21530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21540 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21550 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
21560 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
21570 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
21580 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
21590 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
215a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
215b0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
215c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
215d0 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
215e0 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
215f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
21600 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
21610 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
21620 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
21630 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
21640 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
21650 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
21660 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
21670 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 70 50  ync_exit;.    pP
21680 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
21690 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
216a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
216b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
216c0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
216d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
216e0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
216f0 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  >fd, 0);.    }. 
21700 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
21710 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
21720 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
21730 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
21740 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  YNCED;.  }else i
21750 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75  f( MEMDB && nTru
21760 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  nc!=0 ){.    rc 
21770 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
21780 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
21790 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e  Trunc);.  }..syn
217a0 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63  c_exit:.  if( rc
217b0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ==SQLITE_IOERR_B
217c0 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a  LOCKED ){.    /*
217d0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
217e0 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20  gecounter() may 
217f0 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
21800 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20  n an exclusive. 
21810 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70      * lock to sp
21820 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e  ill the cache an
21830 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42  d return IOERR_B
21840 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63  LOCKED. But sinc
21850 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20  e .     * there 
21860 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65  is no chance the
21870 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73   cache is incons
21880 69 73 74 65 6e 74 2c 20 69 74 27 73 0a 20 20 20  istent, it's.   
21890 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65    * better to re
218a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
218b0 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  ..     */.    rc
218c0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
218d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
218e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
218f0 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
21900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
21910 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
21920 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
21930 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
21940 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
21950 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
21960 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
21970 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
21980 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
21990 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
219a0 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
219b0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
219c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
219d0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
219e0 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
219f0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
21a00 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
21a10 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
21a20 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
21a30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
21a40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
21a50 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
21a60 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
21a70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
21a80 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52  ROR;.  }.  PAGER
21a90 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
21aa0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
21ab0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
21ac0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  MDB ){.    pPg =
21ad0 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
21ae0 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
21af0 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
21b00 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  Pg ){.      PgHi
21b10 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
21b20 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
21b30 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
21b40 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
21b50 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ist);.      pPg-
21b60 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
21b70 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
21b80 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
21b90 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
21ba0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
21bb0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  nc = 0;.      pH
21bc0 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
21bd0 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
21be0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
21bf0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
21c00 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
21c10 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69  ->pDirty = 0;.#i
21c20 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
21c30 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
21c40 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
21c50 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
21c60 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
21c70 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
21c80 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
21c90 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
21ca0 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
21cb0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
21cc0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
21cd0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
21ce0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
21cf0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
21d00 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
21d10 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
21d20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
21d30 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
21d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21d50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
21d60 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
21d70 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
21d80 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
21d90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21da0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
21db0 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65  SYNCED || !pPage
21dc0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
21dd0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
21de0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
21df0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
21e00 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
21e10 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  er, rc);.}../*.*
21e20 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
21e30 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
21e40 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
21e50 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
21e60 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
21e70 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
21e80 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
21e90 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
21ea0 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
21eb0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
21ec0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
21ed0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
21ee0 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
21ef0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
21f00 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
21f10 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
21f20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
21f30 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
21f40 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
21f50 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
21f60 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
21f70 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
21f80 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
21f90 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
21fa0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
21fb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
21fc0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
21fd0 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
21fe0 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
21ff0 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
22000 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
22010 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
22020 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
22030 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
22040 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
22050 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41  {.  int rc;.  PA
22060 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  GERTRACE2("ROLLB
22070 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
22080 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
22090 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
220a0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
220b0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
220c0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
220d0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
220e0 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
220f0 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
22100 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
22110 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
22120 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
22130 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
22140 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
22150 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
22160 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
22170 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
22180 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
22190 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
221a0 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
221b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
221c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
221d0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
221e0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
221f0 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
22200 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
22210 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
22220 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
22230 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
22240 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
22250 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
22260 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20  ("ROLLBACK-PAGE 
22270 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e  %d of %d\n", p->
22280 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
22290 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65  ager));.      }e
222a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47  lse{.        PAG
222b0 45 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25  ERTRACE3("PAGE %
222c0 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64  d is clean on %d
222d0 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
222e0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
222f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
22300 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
22310 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
22320 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
22330 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
22340 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
22350 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  mt = 0;.      pH
22360 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
22370 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
22380 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
22390 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
223a0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
223b0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
223c0 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  p, pPager->pageS
223d0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
223e0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
223f0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
22400 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
22410 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
22420 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
22430 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
22440 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
22450 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
22460 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
22470 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
22480 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
22490 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
224a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
224b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
224c0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
224d0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
224e0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
224f0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
22500 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
22510 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
22520 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
22530 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
22540 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
22550 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
22560 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22570 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
22580 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
22590 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
225a0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
225b0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
225c0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
225d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
225e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
225f0 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
22600 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
22610 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
22620 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
22630 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
22640 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
22650 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
22660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22670 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
22680 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
22690 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
226a0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
226b0 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73  }.  /* pager_res
226c0 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  et(pPager); */. 
226d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
226e0 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  = -1;..  /* If a
226f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
22700 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
22710 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
22720 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
22730 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  er.  ** cache. S
22740 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
22750 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
22760 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
22770 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73  error .  ** pers
22780 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72  istent..  */.  r
22790 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
227a0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
227b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
227c0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
227d0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
227e0 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
227f0 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
22800 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
22810 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
22820 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  itable..*/.int s
22830 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
22840 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
22850 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
22860 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
22870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22880 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
22890 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
228a0 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
228b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
228c0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
228d0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
228e0 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69  ger->nRef;.}..#i
228f0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
22900 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
22910 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
22920 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
22930 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
22940 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
22950 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
22960 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
22970 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
22980 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
22990 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
229a0 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
229b0 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
229c0 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
229d0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
229e0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
229f0 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
22a00 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
22a10 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
22a20 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
22a30 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
22a40 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
22a50 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
22a60 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
22a70 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
22a80 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
22a90 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
22aa0 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
22ab0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
22ac0 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
22ad0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
22ae0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
22af0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
22b00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22b10 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
22b20 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
22b30 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
22b40 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
22b50 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
22b60 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
22b70 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
22b80 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
22b90 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
22ba0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
22bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
22bc0 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
22bd0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
22be0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
22bf0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
22c00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
22c10 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
22c20 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
22c30 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
22c40 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  ze>=0 );.  PAGER
22c50 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
22c60 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
22c70 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
22c80 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
22c90 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
22ca0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
22cb0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
22cc0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
22cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22ce0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
22cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
22d00 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
22d10 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
22d20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
22d30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
22d40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
22d50 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
22d60 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
22d70 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
22d80 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ero( pPager->dbS
22d90 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
22da0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
22db0 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  mt==0 ){.    /* 
22dc0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
22dd0 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
22de0 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72  _LOCK); */.    r
22df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22e00 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
22e10 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
22e20 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
22e30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
22e40 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
22e50 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
22e60 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
22e70 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
22e80 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
22e90 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
22ea0 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
22eb0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
22ec0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
22ed0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
22ee0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
22ef0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
22f00 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
22f10 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
22f20 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
22f30 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
22f40 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
22f50 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
22f60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22f70 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
22f80 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
22f90 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
22fa0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
22fb0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
22fc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
22fd0 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
22fe0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
22ff0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
23000 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
23010 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23020 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
23030 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
23040 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
23050 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23060 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  free(pPager->aIn
23070 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
23080 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
23090 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
230a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
230b0 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
230c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
230d0 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65  rStmtCommit(Page
230e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
230f0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
23100 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
23110 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
23120 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
23130 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
23140 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
23150 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
23160 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  MDB ){.      /* 
23170 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
23180 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
23190 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  0); */.      sql
231a0 69 74 65 33 5f 66 72 65 65 28 20 70 50 61 67 65  ite3_free( pPage
231b0 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20  r->aInStmt );.  
231c0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
231d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
231e0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  se{.      for(pP
231f0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
23200 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
23210 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
23220 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
23230 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
23240 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
23250 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e   pNext = pHist->
23260 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
23270 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
23280 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
23290 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
232a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
232b0 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
232c0 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
232d0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
232e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
232f0 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
23300 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
23310 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
23320 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
23330 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
23340 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
23350 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
23360 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
23370 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
23380 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
23390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
233a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
233b0 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
233c0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
233d0 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61  3PagerStmtRollba
233e0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
233f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
23400 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
23410 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
23420 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
23430 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
23440 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
23450 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
23460 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
23470 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
23480 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
23490 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
234a0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
234b0 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
234c0 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
234d0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
234e0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
234f0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
23500 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
23510 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
23520 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
23530 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
23540 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
23550 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
23560 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
23570 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
23580 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
23590 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
235a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
235b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
235c0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
235d0 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
235e0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
235f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
23600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
23610 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
23620 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
23630 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
23640 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
23650 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
23660 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
23670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23680 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
23690 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
236a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
236b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
236c0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
236d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
236e0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
236f0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
23700 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
23710 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
23720 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
23730 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
23740 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
23750 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
23760 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
23770 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
23780 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
23790 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
237a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
237b0 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
237c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
237d0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
237e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
237f0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
23800 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
23810 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
23820 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
23830 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
23840 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
23850 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
23860 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
23870 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
23880 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
23890 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
238a0 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
238b0 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
238c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
238d0 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
238e0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
238f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
23900 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
23910 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
23920 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
23930 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
23940 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23950 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
23960 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
23970 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
23980 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
23990 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
239a0 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
239b0 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
239c0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
239d0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
239e0 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  cArg;.}.#endif..
239f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23a00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
23a10 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
23a20 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
23a30 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
23a40 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
23a50 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
23a60 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
23a70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
23a80 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e  ocated at.** pgn
23a90 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c  o (which we call
23aa0 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20   pPgOld) though 
23ab0 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c  that page is all
23ac0 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  owed to be.** in
23ad0 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20   cache.  If the 
23ae0 70 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f  page previous lo
23af0 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73  cated at pgno is
23b00 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
23b10 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
23b20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
23b30 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20  ot put there by 
23b40 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
23b50 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
23b60 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50  s to the page pP
23b70 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  g remain valid. 
23b80 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
23b90 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
23ba0 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69  ated with pPg (i
23bb0 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
23bc0 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
23bd0 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
23be0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
23bf0 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
23c00 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
23c10 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
23c20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
23c30 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
23c40 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
23c50 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
23c60 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
23c70 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
23c80 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
23c90 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
23ca0 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
23cb0 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
23cc0 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
23cd0 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
23ce0 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
23cf0 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
23d00 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
23d10 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74   active)..*/.int
23d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
23d30 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  epage(Pager *pPa
23d40 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67  ger, DbPage *pPg
23d50 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
23d60 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
23d70 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e  /* The page bein
23d80 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a  g overwritten. *
23d90 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e  /.  int h;.  Pgn
23da0 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
23db0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
23dc0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
23dd0 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
23de0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
23df0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
23e00 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
23e10 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
23e20 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
23e30 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
23e40 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
23e50 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
23e60 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
23e70 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
23e80 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
23e90 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  t(pPg);.  if( pP
23ea0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
23eb0 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
23ec0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
23ed0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
23ee0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
23ef0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
23f00 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
23f10 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
23f20 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
23f30 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
23f40 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  c );.  }..  /* U
23f50 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
23f60 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a  t's hash-chain *
23f70 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
23f80 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
23f90 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
23fa0 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
23fb0 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
23fc0 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
23fd0 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
23fe0 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e  it's hash chain.
23ff0 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
24000 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
24010 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
24020 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
24030 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
24040 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
24050 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
24060 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
24070 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
24080 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  */.  pPg->needSy
24090 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64  nc = 0;.  pPgOld
240a0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
240b0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
240c0 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
240d0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
240e0 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  d->nRef==0 );.  
240f0 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
24100 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64  n(pPager, pPgOld
24110 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
24120 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50  (pPgOld);.    pP
24130 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50  g->needSync = pP
24140 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a  gOld->needSync;.
24150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
24160 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
24170 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
24180 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
24190 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
241a0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
241b0 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
241c0 6e 61 6c 20 3d 20 20 28 70 50 61 67 65 72 2d 3e  nal =  (pPager->
241d0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
241e0 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
241f0 29 29 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  )))!=0;.  }else{
24200 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
24210 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  nal = 0;.    ass
24220 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
24230 6e 63 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 70 67  nc==0 || (int)pg
24240 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
24250 62 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 0a 20 20  bSize );.  }..  
24260 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61  /* Change the pa
24270 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50  ge number for pP
24280 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  g and insert it 
24290 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73  into the new has
242a0 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73  h-chain. */.  as
242b0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
242c0 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70  .  pPg->pgno = p
242d0 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20  gno;.  h = pgno 
242e0 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
242f0 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  -1);.  if( pPage
24300 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  r->aHash[h] ){. 
24310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24320 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
24330 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
24340 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
24350 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
24360 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
24370 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
24380 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70  r->aHash[h];.  p
24390 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
243a0 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50  = pPg;.  pPg->pP
243b0 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20  revHash = 0;..  
243c0 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
243d0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
243e0 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28  ache = 1;..  if(
243f0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
24400 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
24410 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
24420 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
24430 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
24440 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
24450 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
24460 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
24470 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
24480 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
24490 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
244a0 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
244b0 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
244c0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
244d0 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
244e0 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ager.aInJournal 
244f0 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
24500 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
24510 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
24520 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
24530 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
24540 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
24550 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
24560 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
24570 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
24580 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
24590 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61  et() call may ca
245a0 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  use the journal 
245b0 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65  to sync. So make
245c0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65  .    ** sure the
245d0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
245e0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e  flag is set too.
245f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
24600 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  rc;.    PgHdr *p
24610 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
24620 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
24630 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
24640 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
24650 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
24660 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
24670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24680 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
24690 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  c;.    pPager->n
246a0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
246b0 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e   pPgHdr->needSyn
246c0 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
246d0 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  r->inJournal = 1
246e0 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28  ;.    makeDirty(
246f0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c  pPgHdr);.    sql
24700 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
24710 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  PgHdr);.  }..  r
24720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24730 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
24740 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24750 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f  r to the data fo
24760 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
24770 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
24780 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
24790 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ta(DbPage *pPg){
247a0 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
247b0 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
247c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
247d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
247e0 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
247f0 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
24800 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
24810 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
24820 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
24830 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
24840 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
24850 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
24860 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
24870 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
24880 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44  urn (pPager?PGHD
24890 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
248a0 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f  pPager):0);.}../
248b0 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
248c0 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
248d0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
248e0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
248f0 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
24900 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
24910 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
24920 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
24930 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
24940 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
24950 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
24960 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
24970 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
24980 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
24990 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
249a0 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
249b0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
249c0 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
249d0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
249e0 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
249f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
24a00 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
24a10 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
24a20 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
24a30 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
24a40 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
24a50 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
24a60 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
24a70 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
24a80 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
24a90 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
24aa0 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
24ab0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
24ac0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
24ad0 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
24ae0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
24af0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
24b00 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
24b10 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
24b20 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
24b30 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
24b40 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
24b50 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
24b60 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
24b70 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
24b80 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
24b90 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
24ba0 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
24bb0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
24bc0 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  e = eMode;.  }. 
24bd0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
24be0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
24bf0 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  de;.}..#if defin
24c00 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
24c10 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
24c20 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
24c30 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
24c40 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
24c50 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
24c60 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
24c70 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
24c80 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
24c90 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
24ca0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
24cb0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
24cc0 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
24cd0 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
24ce0 74 65 33 50 61 67 65 72 4c 6f 63 6b 73 74 61 74  te3PagerLockstat
24cf0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
24d00 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
24d10 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70 50  e3OsLockState(pP
24d20 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e  ager->fd);.}.#en
24d30 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
24d40 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
24d50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
24d60 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
24d70 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
24d80 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
24d90 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
24da0 52 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  Refdump(Pager *p
24db0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
24dc0 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
24dd0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
24de0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
24df0 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
24e00 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
24e10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69  ntinue;.    sqli
24e20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
24e30 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70  PAGE %3d addr=%p
24e40 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
24e50 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
24e60 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
24e70 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
24e80 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65    }.}.#endif..#e
24e90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
24ea0 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.