/ Hex Artifact Content
Login

Artifact 7b302d90674ea411d0856057af9699fe003318e3:


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 34 32  : pager.c,v 1.42
0350: 33 20 32 30 30 38 2f 30 34 2f 30 33 20 31 30 3a  3 2008/04/03 10:
0360: 31 33 3a 30 31 20 64 61 6e 69 65 6c 6b 31 39 37  13:01 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 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 73 71  #if 0.#define sq
0420: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0430: 20 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20   printf.#define 
0440: 50 41 47 45 52 54 52 41 43 45 31 28 58 29 20 20  PAGERTRACE1(X)  
0450: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
0460: 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66 69  gPrintf(X).#defi
0470: 6e 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58  ne PAGERTRACE2(X
0480: 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44  ,Y)     sqlite3D
0490: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a  ebugPrintf(X,Y).
04a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04b0: 43 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c  CE3(X,Y,Z)   sql
04c0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04d0: 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50  X,Y,Z).#define P
04e0: 41 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a  AGERTRACE4(X,Y,Z
04f0: 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ,W) sqlite3Debug
0500: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 29 0a  Printf(X,Y,Z,W).
0510: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0520: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0530: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0540: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0550: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0560: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0570: 65 20 50 41 47 45 52 54 52 41 43 45 32 28 58 2c  e PAGERTRACE2(X,
0580: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
0590: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64  TRACE3(X,Y,Z).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
05c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
05d0: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e 64 69 66  ,Y,Z,W,V).#endif
05e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
05f0: 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73  owing two macros
0600: 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69 6e   are used within
0610: 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45 58   the PAGERTRACEX
0620: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
0630: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
0640: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0650: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
0660: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
0670: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
0680: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
0690: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
06a0: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
06b0: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
06c0: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
06d0: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
06e0: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
06f0: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
0700: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
0710: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
0720: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0730: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0740: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0750: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0760: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0770: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0780: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0790: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
07a0: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
07b0: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
07c0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07e0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
0800: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0810: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
0820: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0840: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0850: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0860: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0890: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
08a0: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
08b0: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
08c0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08f0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
0900: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0920: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0930: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0940: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0950: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0960: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0970: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0990: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
09a0: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
09b0: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
09c0: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09e0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09f0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
0a00: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
0a10: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a40: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a50: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a60: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a90: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0aa0: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0ab0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0ac0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0ad0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ae0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0af0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b10: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0b20: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b30: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b40: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b70: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b80: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b90: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0ba0: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0bc0: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0bd0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0be0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0c10: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0c20: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c30: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c40: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c50: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c60: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c80: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c90: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0ca0: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0cd0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0ce0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cf0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0d10: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0d20: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d30: 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20  remove or.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20     truncate the 
0d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
0d70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0d80: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0d90: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
0da0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  be committed..**
0db0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0dc0: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0dd0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0de0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0df0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  * sqlite3PagerGe
0e00: 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20  t() occurs, the 
0e10: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0e20: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
0e30: 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20  D..** After all 
0e40: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
0e50: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
0e60: 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66  qlite_page_unref
0e70: 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  (),.** the state
0e80: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63   transitions bac
0e90: 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43  k to PAGER_UNLOC
0ea0: 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  K.  The first ti
0eb0: 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74  me.** that sqlit
0ec0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
0ed0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0ee0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0ef0: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0f00: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0f10: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0f20: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0f30: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0f40: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0f50: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0f60: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0f70: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0f80: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
0f90: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
0fa0: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
0fb0: 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .).** PAGER_RESE
0fc0: 52 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20  RVED means that 
0fd0: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e  there is an open
0fe0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0ff0: 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  l..** The transi
1000: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
1010: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62  CLUSIVE occurs b
1020: 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1030: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1040: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1050: 6c 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65  le, though write
1060: 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  s to the rollbac
1070: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63  k.** journal occ
1080: 75 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41  urs with just PA
1090: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41  GER_RESERVED.  A
10a0: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50  fter an sqlite3P
10b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  agerRollback().*
10c0: 2a 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  * or sqlite3Page
10d0: 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
10e0: 29 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e  ), the state can
10f0: 20 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45   go back to PAGE
1100: 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20  R_SHARED,.** or 
1110: 69 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50  it can stay at P
1120: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69  AGER_EXCLUSIVE i
1130: 66 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  f we are in excl
1140: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
1150: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  e..*/.#define PA
1160: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1170: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1180: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1190: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
11a0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
11b0: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
11c0: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
11d0: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
11e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
1200: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
1210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
1220: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
1230: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
1240: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1250: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1260: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1270: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1280: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1290: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
12a0: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
12b0: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
12c0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
12d0: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
12e0: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12f0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
1300: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
1310: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
1320: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
1330: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
1340: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1350: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1360: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1370: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1380: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1390: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
13a0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
13b0: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
13c0: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
13d0: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
13e0: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13f0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
1400: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
1410: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
1420: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
1430: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
1440: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1450: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1460: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1470: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1480: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1490: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
14a0: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
14b0: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
14c0: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
14d0: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
14e0: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1500: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
1510: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
1520: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
1530: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1540: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1550: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1560: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1570: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1580: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1590: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
15a0: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
15b0: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
15c0: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
15d0: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
15e0: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15f0: 29 26 7e 37 29 0a 0a 74 79 70 65 64 65 66 20 73  )&~7)..typedef s
1600: 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64  truct PgHdr PgHd
1610: 72 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 70  r;../*.** Each p
1620: 61 67 65 72 20 73 74 6f 72 65 73 20 61 6c 6c 20  ager stores all 
1630: 63 75 72 72 65 6e 74 6c 79 20 75 6e 72 65 66 65  currently unrefe
1640: 72 65 6e 63 65 64 20 70 61 67 65 73 20 69 6e 20  renced pages in 
1650: 61 20 6c 69 73 74 20 73 6f 72 74 65 64 0a 2a 2a  a list sorted.**
1660: 20 69 6e 20 6c 65 61 73 74 2d 72 65 63 65 6e 74   in least-recent
1670: 6c 79 2d 75 73 65 64 20 28 4c 52 55 29 20 6f 72  ly-used (LRU) or
1680: 64 65 72 20 28 69 2e 65 2e 20 74 68 65 20 66 69  der (i.e. the fi
1690: 72 73 74 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  rst item on the 
16a0: 6c 69 73 74 20 68 61 73 20 0a 2a 2a 20 6e 6f 74  list has .** not
16b0: 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
16c0: 20 69 6e 20 61 20 6c 6f 6e 67 20 74 69 6d 65 2c   in a long time,
16d0: 20 74 68 65 20 6c 61 73 74 20 69 74 65 6d 20 68   the last item h
16e0: 61 73 20 62 65 65 6e 20 72 65 63 65 6e 74 6c 79  as been recently
16f0: 0a 2a 2a 20 75 73 65 64 29 2e 20 41 6e 20 69 6e  .** used). An in
1700: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1710: 74 72 75 63 74 75 72 65 20 69 73 20 69 6e 63 6c  tructure is incl
1720: 75 64 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  uded as part of 
1730: 65 61 63 68 0a 2a 2a 20 70 61 67 65 72 20 73 74  each.** pager st
1740: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  ructure for this
1750: 20 70 75 72 70 6f 73 65 20 28 76 61 72 69 61 62   purpose (variab
1760: 6c 65 20 50 61 67 65 72 2e 6c 72 75 29 2e 0a 2a  le Pager.lru)..*
1770: 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  *.** Additionall
1780: 79 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  y, if memory-man
1790: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
17a0: 65 64 2c 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ed, all unrefere
17b0: 6e 63 65 64 20 70 61 67 65 73 20 0a 2a 2a 20 61  nced pages .** a
17c0: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 67  re stored in a g
17d0: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 20 28  lobal LRU list (
17e0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
17f0: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1800: 73 74 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 62 6f  st)..**.** In bo
1810: 74 68 20 63 61 73 65 73 2c 20 74 68 65 20 50 61  th cases, the Pa
1820: 67 65 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73  gerLruList.pFirs
1830: 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65  tSynced variable
1840: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1850: 65 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  e first page in 
1860: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1870: 67 20 6c 69 73 74 20 74 68 61 74 20 64 6f 65 73  g list that does
1880: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 0a   not require an.
1890: 2a 2a 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61  ** fsync() opera
18a0: 74 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 73 20  tion before its 
18b0: 6d 65 6d 6f 72 79 20 63 61 6e 20 62 65 20 72 65  memory can be re
18c0: 63 6c 61 69 6d 65 64 2e 20 49 66 20 6e 6f 20 73  claimed. If no s
18d0: 75 63 68 0a 2a 2a 20 70 61 67 65 20 65 78 69 73  uch.** page exis
18e0: 74 73 2c 20 50 61 67 65 72 4c 72 75 4c 69 73 74  ts, PagerLruList
18f0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 69 73  .pFirstSynced is
1900: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f   set to NULL..*/
1910: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1920: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 50 61 67  PagerLruList Pag
1930: 65 72 4c 72 75 4c 69 73 74 3b 0a 73 74 72 75 63  erLruList;.struc
1940: 74 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 7b  t PagerLruList {
1950: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
1960: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  ;         /* Fir
1970: 73 74 20 70 61 67 65 20 69 6e 20 4c 52 55 20 6c  st page in LRU l
1980: 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1990: 70 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  pLast;          
19a0: 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e 20  /* Last page in 
19b0: 4c 52 55 20 6c 69 73 74 20 28 74 68 65 20 6d 6f  LRU list (the mo
19c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64  st recently used
19d0: 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  ) */.  PgHdr *pF
19e0: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 2f 2a  irstSynced;   /*
19f0: 20 46 69 72 73 74 20 70 61 67 65 20 69 6e 20 6c   First page in l
1a00: 69 73 74 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ist with PgHdr.n
1a10: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 7d 3b  eedSync==0 */.};
1a20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1a30: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1a40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 65 78  contains the nex
1a50: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 70  t and previous p
1a60: 6f 69 6e 74 65 72 73 20 75 73 65 64 0a 2a 2a 20  ointers used.** 
1a70: 74 6f 20 6c 69 6e 6b 20 61 20 50 67 48 64 72 20  to link a PgHdr 
1a80: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 61  structure into a
1a90: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 69   PagerLruList li
1aa0: 6e 6b 65 64 20 6c 69 73 74 2e 20 0a 2a 2f 0a 74  nked list. .*/.t
1ab0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61  ypedef struct Pa
1ac0: 67 65 72 4c 72 75 4c 69 6e 6b 20 50 61 67 65 72  gerLruLink Pager
1ad0: 4c 72 75 4c 69 6e 6b 3b 0a 73 74 72 75 63 74 20  LruLink;.struct 
1ae0: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 7b 0a 20  PagerLruLink {. 
1af0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
1b00: 20 50 67 48 64 72 20 2a 70 50 72 65 76 3b 0a 7d   PgHdr *pPrev;.}
1b10: 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  ;../*.** Each in
1b20: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
1b30: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
1b40: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
1b50: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
1b60: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1b70: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1b80: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1b90: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1ba0: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1bb0: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1bc0: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1bd0: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1be0: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1bf0: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1c00: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c10: 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f  ) on a page prio
1c20: 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61  r to making.** a
1c30: 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
1c40: 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20   to that page.  
1c50: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73  The first time s
1c60: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1c70: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
1c80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
1c90: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1ca0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1cb0: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1cc0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
1cd0: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
1ce0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
1cf0: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
1d00: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
1d10: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
1d20: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
1d30: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
1d40: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
1d50: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
1d60: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
1d70: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
1d80: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1d90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1da0: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1db0: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
1dc0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1dd0: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
1de0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
1df0: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
1e00: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
1e10: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
1e20: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61  t when sqlite3Pa
1e30: 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1e40: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
1e50: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
1e60: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
1e70: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1e80: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1e90: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1ea0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69  ile..**.** Detai
1eb0: 6c 73 20 6f 66 20 69 6d 70 6f 72 74 61 6e 74 20  ls of important 
1ec0: 73 74 72 75 63 74 75 72 65 20 65 6c 65 6d 65 6e  structure elemen
1ed0: 74 73 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79  ts:.**.** needSy
1ee0: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  nc.**.**     If 
1ef0: 74 68 69 73 20 69 73 20 74 72 75 65 2c 20 74 68  this is true, th
1f00: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 74  is means that it
1f10: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
1f20: 77 72 69 74 65 20 74 68 65 20 70 61 67 65 0a 2a  write the page.*
1f30: 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 74 6f  *     content to
1f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1f50: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
1f60: 61 6c 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 65  al content neede
1f70: 64 0a 2a 2a 20 20 20 20 20 66 6f 72 20 72 6f 6c  d.**     for rol
1f80: 6c 62 61 63 6b 20 68 61 73 20 6e 6f 74 20 62 79  lback has not by
1f90: 20 73 79 6e 63 65 64 20 74 6f 20 74 68 65 20 6d   synced to the m
1fa0: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
1fb0: 72 6e 61 6c 2e 0a 2a 2a 20 20 20 20 20 54 68 65  rnal..**     The
1fc0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
1fd0: 74 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  t may have been 
1fe0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 72  written to the r
1ff0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
2000: 2a 2a 20 20 20 20 20 62 75 74 20 69 74 20 68 61  **     but it ha
2010: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 73  s not yet been s
2020: 79 6e 63 65 64 2e 20 20 53 6f 20 77 65 20 63 61  ynced.  So we ca
2030: 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68  nnot write to th
2040: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
2050: 20 20 66 69 6c 65 20 62 65 63 61 75 73 65 20 70    file because p
2060: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6d 69 67  ower failure mig
2070: 68 74 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ht cause the pag
2080: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
2090: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 74 6f 20   file.**     to 
20a0: 6e 65 76 65 72 20 72 65 61 63 68 20 74 68 65 20  never reach the 
20b0: 64 69 73 6b 2e 20 20 49 74 20 69 73 20 61 73 20  disk.  It is as 
20c0: 69 66 20 74 68 65 20 77 72 69 74 65 20 74 6f 20  if the write to 
20d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20e0: 0a 2a 2a 20 20 20 20 20 64 6f 65 73 20 6e 6f 74  .**     does not
20f0: 20 6f 63 63 75 72 20 75 6e 74 69 6c 20 74 68 65   occur until the
2100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2110: 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 20 20 20 20   synced..**     
2120: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
2130: 67 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  g is false if th
2140: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 65  e page content e
2150: 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 77  xactly matches w
2160: 68 61 74 0a 2a 2a 20 20 20 20 20 63 75 72 72 65  hat.**     curre
2170: 6e 74 6c 79 20 65 78 69 73 74 73 20 69 6e 20 74  ntly exists in t
2180: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2190: 2e 20 20 54 68 65 20 6e 65 65 64 53 79 6e 63 20  .  The needSync 
21a0: 66 6c 61 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  flag is also.** 
21b0: 20 20 20 20 66 61 6c 73 65 20 69 66 20 74 68 65      false if the
21c0: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
21d0: 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  t has been writt
21e0: 65 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  en to the main r
21f0: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 6a  ollback.**     j
2200: 6f 75 72 6e 61 6c 20 61 6e 64 20 73 79 6e 63 65  ournal and synce
2210: 64 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  d.  If the page 
2220: 72 65 70 72 65 73 65 6e 74 73 20 61 20 6e 65 77  represents a new
2230: 20 70 61 67 65 20 74 68 61 74 20 68 61 73 0a 2a   page that has.*
2240: 2a 20 20 20 20 20 62 65 65 6e 20 61 64 64 65 64  *     been added
2250: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
2260: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
2270: 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
2280: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
2290: 69 6f 6e 2c 20 74 68 65 20 6e 65 65 64 53 79 6e  ion, the needSyn
22a0: 63 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 75  c flag is true u
22b0: 6e 74 69 6c 20 74 68 65 20 6f 72 69 67 69 6e 61  ntil the origina
22c0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  l database.**   
22d0: 20 20 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f    size in the jo
22e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
22f0: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2300: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f  disk..**.** inJo
2310: 75 72 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20 20 20 20  urnal.**.**     
2320: 54 68 69 73 20 69 73 20 74 72 75 65 20 69 66 20  This is true if 
2330: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2340: 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  e has been writt
2350: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  en into the main
2360: 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  .**     rollback
2370: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
2380: 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
2390: 66 6f 72 20 6e 65 77 20 70 61 67 65 73 20 61 64  for new pages ad
23a0: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
23b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
23c0: 61 62 61 73 65 20 66 69 6c 65 20 64 75 72 69 6e  abase file durin
23d0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
23e0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20  ansaction..**   
23f0: 20 20 41 6e 64 20 74 68 69 73 20 66 6c 61 67 20    And this flag 
2400: 73 61 79 73 20 6e 6f 74 68 69 6e 67 20 61 62 6f  says nothing abo
2410: 75 74 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ut whether or no
2420: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  t the journal.**
2430: 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 73 79       has been sy
2440: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 46  nced to disk.  F
2450: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 61 72  or pages that ar
2460: 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  e in the origina
2470: 6c 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73  l.**     databas
2480: 65 20 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c 6c  e file, the foll
2490: 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
24a0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
24b0: 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
24c0: 20 20 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20      inJournal = 
24d0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
24e0: 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24f0: 72 6e 61 6c 2c 20 70 67 6e 6f 29 0a 2a 2a 0a 2a  rnal, pgno).**.*
2500: 2a 20 20 20 20 20 54 68 65 20 70 50 61 67 65 72  *     The pPager
2510: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 6f 62 6a  ->pInJournal obj
2520: 65 63 74 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  ect is only vali
2530: 64 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  d for the origin
2540: 61 6c 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20  al.**     pages 
2550: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
2560: 20 6e 6f 74 20 6e 65 77 20 70 61 67 65 73 20 74   not new pages t
2570: 68 61 74 20 61 72 65 20 61 64 64 65 64 20 74 6f  hat are added to
2580: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 20 20 20 20   the end.**     
2590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
25a0: 20 73 6f 20 6f 62 76 69 6f 75 73 6c 79 20 74 68   so obviously th
25b0: 65 20 61 62 6f 76 65 20 65 78 70 72 65 73 73 69  e above expressi
25c0: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  on cannot be.** 
25d0: 20 20 20 20 76 61 6c 69 64 20 66 6f 72 20 6e 65      valid for ne
25e0: 77 20 70 61 67 65 73 2e 20 20 46 6f 72 20 6e 65  w pages.  For ne
25f0: 77 20 70 61 67 65 73 20 69 6e 4a 6f 75 72 6e 61  w pages inJourna
2600: 6c 20 69 73 20 61 6c 77 61 79 73 20 30 2e 0a 2a  l is always 0..*
2610: 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a 2a 0a 2a 2a  *.** dirty.**.**
2620: 20 20 20 20 20 57 68 65 6e 20 74 72 75 65 2c 20       When true, 
2630: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  this means that 
2640: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2650: 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
2660: 0a 2a 2a 20 20 20 20 20 6d 6f 64 69 66 69 65 64  .**     modified
2670: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
2680: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
2690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26a0: 6c 65 2e 0a 2a 2a 20 20 20 20 20 49 66 20 66 61  le..**     If fa
26b0: 6c 73 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  lse, it means th
26c0: 61 74 20 65 69 74 68 65 72 20 74 68 65 20 63 6f  at either the co
26d0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
26e0: 65 20 69 73 0a 2a 2a 20 20 20 20 20 75 6e 63 68  e is.**     unch
26f0: 61 6e 67 65 64 20 6f 72 20 65 6c 73 65 20 74 68  anged or else th
2700: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 75 6e 69  e content is uni
2710: 6d 70 6f 72 74 61 6e 74 20 61 6e 64 20 77 65 20  mportant and we 
2720: 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 63 61  do not.**     ca
2730: 72 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  re whether or no
2740: 74 20 69 74 20 69 73 20 70 72 65 73 65 72 76 65  t it is preserve
2750: 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77 61 79 73 52  d..**.** alwaysR
2760: 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  ollback.**.**   
2770: 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
2780: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2790: 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
27a0: 20 41 50 49 20 73 68 6f 75 6c 64 20 62 65 0a 2a   API should be.*
27b0: 2a 20 20 20 20 20 69 67 6e 6f 72 65 64 20 66 6f  *     ignored fo
27c0: 72 20 74 68 69 73 20 70 61 67 65 2e 20 20 54 68  r this page.  Th
27d0: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
27e0: 20 41 50 49 20 61 74 74 65 6d 70 74 73 20 74 6f   API attempts to
27f0: 20 73 61 79 0a 2a 2a 20 20 20 20 20 74 68 61 74   say.**     that
2800: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2810: 74 68 65 20 70 61 67 65 20 6f 6e 20 64 69 73 6b  the page on disk
2820: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2830: 28 69 74 20 69 73 20 61 6e 0a 2a 2a 20 20 20 20  (it is an.**    
2840: 20 75 6e 75 73 65 64 20 70 61 67 65 20 6f 6e 20   unused page on 
2850: 74 68 65 20 66 72 65 65 6c 69 73 74 29 20 73 6f  the freelist) so
2860: 20 74 68 61 74 20 69 74 20 69 73 20 75 6e 6e 65   that it is unne
2870: 63 65 73 73 61 72 79 20 74 6f 20 0a 2a 2a 20 20  cessary to .**  
2880: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 63 68 61 6e     rollback chan
2890: 67 65 73 20 74 6f 20 74 68 69 73 20 70 61 67 65  ges to this page
28a0: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 6e   because the con
28b0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
28c0: 0a 2a 2a 20 20 20 20 20 63 61 6e 20 63 68 61 6e  .**     can chan
28d0: 67 65 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ge without chang
28e0: 69 6e 67 20 74 68 65 20 6d 65 61 6e 69 6e 67 20  ing the meaning 
28f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2900: 20 20 54 68 69 73 0a 2a 2a 20 20 20 20 20 66 6c    This.**     fl
2910: 61 67 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  ag overrides any
2920: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2930: 61 74 74 65 6d 70 74 2e 20 20 54 68 69 73 20 66  attempt.  This f
2940: 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  lag is set.**   
2950: 20 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68    when a page th
2960: 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  at originally co
2970: 6e 74 61 69 6e 65 64 20 76 61 6c 69 64 20 64 61  ntained valid da
2980: 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  ta is added to.*
2990: 2a 20 20 20 20 20 74 68 65 20 66 72 65 65 6c 69  *     the freeli
29a0: 73 74 2e 20 20 4c 61 74 65 72 20 69 6e 20 74 68  st.  Later in th
29b0: 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
29c0: 6f 6e 2c 20 74 68 69 73 20 70 61 67 65 20 6d 69  on, this page mi
29d0: 67 68 74 0a 2a 2a 20 20 20 20 20 62 65 20 70 75  ght.**     be pu
29e0: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  lled from the fr
29f0: 65 65 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  eelist and reuse
2a00: 64 20 66 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20  d for something 
2a10: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 20 20 20  different.**    
2a20: 20 61 6e 64 20 61 74 20 74 68 61 74 20 70 6f 69   and at that poi
2a30: 6e 74 20 74 68 65 20 44 6f 6e 74 52 6f 6c 6c 62  nt the DontRollb
2a40: 61 63 6b 28 29 20 41 50 49 20 77 69 6c 6c 20 62  ack() API will b
2a50: 65 20 63 61 6c 6c 65 64 20 62 65 63 61 75 73 65  e called because
2a60: 0a 2a 2a 20 20 20 20 20 70 61 67 65 73 20 74 61  .**     pages ta
2a70: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ken from the fre
2a80: 65 6c 69 73 74 20 64 6f 20 6e 6f 74 20 6e 65 65  elist do not nee
2a90: 64 20 74 6f 20 62 65 20 70 72 6f 74 65 63 74 65  d to be protecte
2aa0: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
2ab0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2ac0: 2e 20 20 42 75 74 20 74 68 69 73 20 66 6c 61 67  .  But this flag
2ad0: 20 73 61 79 73 20 74 68 61 74 20 74 68 65 20 70   says that the p
2ae0: 61 67 65 20 77 61 73 0a 2a 2a 20 20 20 20 20 6e  age was.**     n
2af0: 6f 74 20 6f 72 69 67 69 6e 61 6c 6c 79 20 70 61  ot originally pa
2b00: 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  rt of the freeli
2b10: 73 74 20 73 6f 20 74 68 61 74 20 69 74 20 73 74  st so that it st
2b20: 69 6c 6c 20 6e 65 65 64 73 20 74 6f 0a 2a 2a 20  ill needs to.** 
2b30: 20 20 20 20 62 65 20 72 6f 6c 6c 65 64 20 62 61      be rolled ba
2b40: 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 61  ck in spite of a
2b50: 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20 44 6f  ny subsequent Do
2b60: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
2b70: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 52 65  ls..**.** needRe
2b80: 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  ad .**.**     Th
2b90: 69 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 28 77  is flag means (w
2ba0: 68 65 6e 20 74 72 75 65 29 20 74 68 61 74 20 74  hen true) that t
2bb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2bc0: 65 20 70 61 67 65 20 68 61 73 0a 2a 2a 20 20 20  e page has.**   
2bd0: 20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6c    not yet been l
2be0: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 2e  oaded from disk.
2bf0: 20 20 54 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20    The in-memory 
2c00: 63 6f 6e 74 65 6e 74 20 69 73 20 6a 75 73 74 0a  content is just.
2c10: 2a 2a 20 20 20 20 20 67 61 72 62 61 67 65 2e 20  **     garbage. 
2c20: 20 28 41 63 74 75 61 6c 6c 79 2c 20 77 65 20 7a   (Actually, we z
2c30: 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 2c  ero the content,
2c40: 20 62 75 74 20 79 6f 75 20 73 68 6f 75 6c 64 20   but you should 
2c50: 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d 61 6b 65 20  not.**     make 
2c60: 61 6e 79 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  any assumptions 
2c70: 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
2c80: 74 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 29  t nevertheless.)
2c90: 20 20 49 66 20 74 68 65 0a 2a 2a 20 20 20 20 20    If the.**     
2ca0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
2cb0: 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  d in the future,
2cc0: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
2cd0: 61 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 20  ad from the.**  
2ce0: 20 20 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61     original data
2cf0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
2d00: 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20 50  ruct PgHdr {.  P
2d10: 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d30: 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77 68   The pager to wh
2d40: 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62 65  ich this page be
2d50: 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  longs */.  Pgno 
2d60: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
2d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d80: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
2d90: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2da0: 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73 68  PgHdr *pNextHash
2db0: 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20 2f  , *pPrevHash;  /
2dc0: 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  * Hash collision
2dd0: 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64 72   chain for PgHdr
2de0: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 61 67 65 72  .pgno */.  Pager
2df0: 4c 72 75 4c 69 6e 6b 20 66 72 65 65 3b 20 20 20  LruLink free;   
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2e10: 74 20 61 6e 64 20 70 72 65 76 69 6f 75 73 20 66  t and previous f
2e20: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
2e30: 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20  gHdr *pNextAll; 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e50: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
2e60: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 69 6e 4a  ages */.  u8 inJ
2e70: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
2e90: 20 69 66 20 68 61 73 20 62 65 65 6e 20 77 72 69   if has been wri
2ea0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
2eb0: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20  */.  u8 dirty;  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77      /* TRUE if w
2ee0: 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  e need to write 
2ef0: 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a  back changes */.
2f00: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c   /* Sync journal
2f30: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
2f40: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2f50: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f70: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
2f80: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
2f90: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 6e 65   page */.  u8 ne
2fa0: 65 64 52 65 61 64 3b 20 20 20 20 20 20 20 20 20  edRead;         
2fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2fc0: 64 20 63 6f 6e 74 65 6e 74 20 69 66 20 50 61 67  d content if Pag
2fd0: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
2fe0: 6c 65 64 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  led */.  short i
2ff0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3010: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
3020: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
3030: 64 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72  dr *pDirty, *pPr
3040: 65 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44  evDirty;    /* D
3050: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 23 69  irty pages */.#i
3060: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3070: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
3080: 4d 45 4e 54 0a 20 20 50 61 67 65 72 4c 72 75 4c  MENT.  PagerLruL
3090: 69 6e 6b 20 67 66 72 65 65 3b 20 20 20 20 20 20  ink gfree;      
30a0: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
30b0: 6c 69 73 74 20 6f 66 20 6e 52 65 66 3d 3d 30 20  list of nRef==0 
30c0: 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  pages */.#endif.
30d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
30e0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
30f0: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
3100: 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 20  .  void *pData; 
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 2f 2a 20 50 61 67 65 20 64 61 74 61 20 2a    /* Page data *
3130: 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78  /.  /* Pager.nEx
3140: 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63  tra bytes of loc
3150: 61 6c 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  al data appended
3160: 20 74 6f 20 74 68 69 73 20 68 65 61 64 65 72 20   to this header 
3170: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
3180: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
3190: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
31a0: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
31b0: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
31c0: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
31d0: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
31e0: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
31f0: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
3200: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
3210: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
3220: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
3230: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
3240: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
3250: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
3260: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
3270: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
3280: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
3290: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
32a0: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
32b0: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
32c0: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
32d0: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
32e0: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
32f0: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
3300: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
3310: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
3320: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
3330: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
3340: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
3350: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
3360: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
3370: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
3380: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
3390: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
33a0: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
33b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
33c0: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
33d0: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
33e0: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
33f0: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
3400: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
3410: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
3420: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
3430: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
3440: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
3450: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
3460: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
3470: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
3480: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
3490: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
34a0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
34b0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
34c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
34d0: 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20  /.  u8 inStmt;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e     /* TRUE if in
3500: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
3510: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a  ubjournal */.};.
3520: 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75  ./*.** A macro u
3530: 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  sed for invoking
3540: 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68   the codec if th
3550: 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69  ere is one.*/.#i
3560: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
3570: 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43  CODEC.# define C
3580: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69  ODEC1(P,D,N,X) i
3590: 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20  f( P->xCodec!=0 
35a0: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
35b0: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
35c0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
35d0: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
35e0: 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21  har*)(P->xCodec!
35f0: 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  =0?P->xCodec(P->
3600: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
3610: 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  :D)).#else.# def
3620: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
3630: 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  ,X) /* NO-OP */.
3640: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
3650: 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a  P,D,N,X) ((char*
3660: 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  )D).#endif../*.*
3670: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
3680: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
3690: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
36a0: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
36b0: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
36c0: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
36d0: 5f 44 41 54 41 28 50 29 20 20 20 20 28 28 50 29  _DATA(P)    ((P)
36e0: 2d 3e 70 44 61 74 61 29 0a 23 64 65 66 69 6e 65  ->pData).#define
36f0: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
3700: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
3710: 47 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  G)[1])).#define 
3720: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c  PGHDR_TO_HIST(P,
3730: 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20  PGR)  \.        
3740: 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a      ((PgHistory*
3750: 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b  )&((char*)(&(P)[
3760: 31 5d 29 29 5b 28 50 47 52 29 2d 3e 6e 45 78 74  1]))[(PGR)->nExt
3770: 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  ra])../*.** A op
3780: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
3790: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
37a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
37b0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50  ructure..**.** P
37c0: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79  ager.errCode may
37d0: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
37e0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
37f0: 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f  CORRUPT, or.** o
3800: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
3810: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
3820: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
3830: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
3840: 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20  sists.** and is 
3850: 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20  returned as the 
3860: 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20  result of every 
3870: 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20  major pager API 
3880: 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  call.  The.** SQ
3890: 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e  LITE_FULL return
38a0: 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c   code is slightl
38b0: 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20  y different. It 
38c0: 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e  persists only un
38d0: 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20  til the.** next 
38e0: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
38f0: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
3900: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
3910: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51  che. Also,.** SQ
3920: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
3930: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
3940: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
3950: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
3960: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73  Lookup().** APIs
3970: 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c  , they may still
3980: 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73   be used success
3990: 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  fully..*/.struct
39a0: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
39b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
39c0: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
39d0: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
39e0: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  r IO */.  u8 jou
39f0: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3a00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3a10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3a20: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3a30: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3a40: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3a50: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3a60: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3a70: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3a80: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
3aa0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
3ab0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
3ac0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
3ad0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
3ae0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3af0: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3b00: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3b10: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3b30: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3b40: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3b50: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3b60: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3b70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3b80: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
3b90: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
3ba0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
3bb0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
3bc0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
3bd0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
3be0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3bf0: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3c00: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3c10: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3c20: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3c30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3c40: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3c60: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3c70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3c80: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
3c90: 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20  8 sync_flags;   
3ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3cb0: 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c  e of SYNC_NORMAL
3cc0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f   or SYNC_FULL */
3cd0: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cf0: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
3d00: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
3d10: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
3d20: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
3d40: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
3d50: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
3d60: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3d80: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
3d90: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
3da0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3dc0: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
3dd0: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
3de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
3df0: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e10: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
3e20: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
3e30: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
3e40: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
3e50: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
3e60: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
3e70: 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  r all pages */. 
3e80: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ea0: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
3eb0: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
3ec0: 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20    u8 setMaster; 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e   True if a m-j n
3ef0: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69  ame has been wri
3f00: 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a  tten to jrnl */.
3f10: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20    u8 doNotSync; 
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f30: 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20   Boolean. While 
3f40: 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69  true, do not spi
3f50: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  ll the cache */.
3f60: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
3f70: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3f80: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
3f90: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
3fa0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
3fb0: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
3fc0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
3fd0: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
3fe0: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
3ff0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
4000: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
4010: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
4020: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
4030: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
4040: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
4050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
4060: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
4070: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
4080: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
40b0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
40c0: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
40d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
40e0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
40f0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
4100: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53  e */.  int stmtS
4110: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4120: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
4130: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
4140: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
4150: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4180: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
4190: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
41a0: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41c0: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
41d0: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
41e0: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
41f0: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4210: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
4220: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
4230: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
4240: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
4250: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
4260: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
4270: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
4280: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
4290: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
42a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
42b0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
42c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
42d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
42e0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
42f0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
4300: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
4310: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
4320: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4330: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
4340: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
4350: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
4360: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
4370: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
4380: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
4390: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
43a0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
43b0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
43c0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
43d0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
43e0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
43f0: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
4400: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
4410: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
4420: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
4430: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4440: 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b  Bitvec *pInStmt;
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4460: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
4470: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
4480: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
4490: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
44a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
44b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
44c0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
44d0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
44e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
44f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4500: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
4510: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
4520: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
4530: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
4540: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
4550: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72  .  char *zStmtJr
4560: 6e 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nl;            /
4570: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74  * Name of the st
4580: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
4590: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
45a0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  3_file *fd, *jfd
45b0: 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65  ;     /* File de
45c0: 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61  scriptors for da
45d0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
45e0: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
45f0: 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  file *stfd;     
4600: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4610: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73  riptor for the s
4620: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
4630: 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64  nal*/.  BusyHand
4640: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
4650: 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  r;  /* Pointer t
4660: 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e  o sqlite.busyHan
4670: 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c  dler */.  PagerL
4680: 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20 20  ruList lru;     
4690: 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73        /* LRU lis
46a0: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
46b0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
46c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
46d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
46e0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
46f0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
4700: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4710: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
4720: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
4730: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
4740: 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20  pDirty;         
4750: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4760: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
4770: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
4780: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
4790: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
47a0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
47b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
47c0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47e0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
47f0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
4800: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
4810: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
4820: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4830: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
4840: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
4850: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
4860: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
4870: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
4880: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
4890: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
48a0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
48b0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
48c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
48d0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
48e0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
48f0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
4900: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
4910: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
4920: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
4930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4940: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4950: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4960: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
4970: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
4980: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
4990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
49a0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
49b0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
49c0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
49d0: 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65  structor)(DbPage
49e0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
49f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4a00: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
4a10: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
4a20: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69  niter)(DbPage*,i
4a30: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
4a40: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
4a50: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
4a60: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4a70: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
4a80: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
4a90: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
4aa0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
4ab0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
4ac0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
4ad0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
4ae0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
4af0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
4b00: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
4b10: 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20  int nHash;      
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4b30: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
4b40: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
4b50: 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20   PgHdr **aHash; 
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b70: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
4b80: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  p page number to
4b90: 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66   PgHdr */.#ifdef
4ba0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
4bb0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
4bc0: 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b  .  Pager *pNext;
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4be0: 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  * Doubly linked 
4bf0: 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 6f  list of pagers o
4c00: 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61 67  n which */.  Pag
4c10: 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  er *pPrev;      
4c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
4c30: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4c40: 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a  ry() will work *
4c50: 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d 4d  /.  int iInUseMM
4c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c70: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75  /* Non-zero if u
4c80: 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d  navailable to MM
4c90: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65   */.  int iInUse
4ca0: 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  DB;             
4cb0: 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66    /* Non-zero if
4cc0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   in sqlite3_rele
4cd0: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a  ase_memory() */.
4ce0: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
4cf0: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
4d00: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
4d10: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
4d20: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
4d30: 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  e */.  char dbFi
4d40: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
4d50: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
4d60: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
4d70: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
4d80: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
4d90: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
4da0: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
4db0: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
4dc0: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
4dd0: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
4de0: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
4df0: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
4e00: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
4e10: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
4e20: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
4e30: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
4e40: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
4e50: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4e60: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
4e70: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4e80: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
4e90: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
4ea0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4eb0: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
4ec0: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
4ed0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
4ee0: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
4ef0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4f00: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
4f10: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4f20: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
4f30: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e  to journal */.in
4f40: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4f50: 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30  pgfree_count = 0
4f60: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4f70: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66 72  f cache pages fr
4f80: 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  eed */.# define 
4f90: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
4fa0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
4fb0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
4fc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
4fd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
4fe0: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
4ff0: 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f 75  he head of a dou
5000: 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a  ble-linked list.
5010: 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72 73  ** of all pagers
5020: 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69 62   that are eligib
5030: 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65 61  le for page stea
5040: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 73  ling by the.** s
5050: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
5060: 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61 63  emory() interfac
5070: 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74 68  e.  Access to th
5080: 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72  is list is.** pr
5090: 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53  otected by the S
50a0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
50b0: 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a  IC_MEM2 mutex..*
50c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
50d0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
50e0: 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63 20  NAGEMENT.static 
50f0: 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50 61  Pager *sqlite3Pa
5100: 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61  gerList = 0;.sta
5110: 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73 74  tic PagerLruList
5120: 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
5130: 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  ist = {0, 0, 0};
5140: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
5150: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
5160: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
5170: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
5180: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
5190: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
51a0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
51b0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
51c0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
51d0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
51e0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
51f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
5200: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
5210: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
5220: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
5230: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
5240: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
5250: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5260: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
5270: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
5280: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
5290: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
52a0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
52b0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
52c0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
52d0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
52e0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
52f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
5300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
5310: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
5320: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
5330: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
5340: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
5350: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
5360: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
5370: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
5380: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
5390: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
53a0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
53b0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
53c0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
53d0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
53e0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
53f0: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
5400: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
5410: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
5420: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
5430: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
5440: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
5450: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
5460: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
5470: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
5480: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
5490: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
54a0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
54b0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
54c0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
54d0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
54e0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
54f0: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
5500: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
5510: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
5520: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
5530: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5540: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
5550: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
5560: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
5570: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
5580: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
5590: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
55a0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
55b0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
55c0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
55d0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
55e0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
55f0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
5600: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
5610: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
5620: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
5630: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
5640: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
5650: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
5660: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
5670: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
5680: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
5690: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
56a0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
56b0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
56c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
56d0: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
56e0: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
56f0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
5700: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
5710: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
5720: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
5730: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
5740: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
5750: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
5760: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
5770: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5780: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
5790: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
57a0: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
57b0: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
57c0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
57d0: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
57e0: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
57f0: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
5800: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
5810: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
5820: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
5830: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
5840: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5850: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
5860: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
5870: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
5880: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
5890: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
58a0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
58b0: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
58c0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
58d0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
58e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
58f0: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
5900: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
5910: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
5920: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
5930: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
5940: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
5950: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
5960: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
5970: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5980: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
5990: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
59a0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
59b0: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
59c0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
59d0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41  * Page number PA
59e0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e  GER_MJ_PGNO is n
59f0: 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20  ever used in an 
5a00: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
5a10: 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76  (it is.** reserv
5a20: 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61  ed for working a
5a30: 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f  round a windows/
5a40: 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62  posix incompatib
5a50: 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a  ility). It is.**
5a60: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75   used in the jou
5a70: 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20  rnal to signify 
5a80: 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64  that the remaind
5a90: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
5aa0: 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65  l file .** is de
5ab0: 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67  voted to storing
5ac0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
5ad0: 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61  l name - there a
5ae0: 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73  re no more pages
5af0: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b   to.** roll back
5b00: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66  . See comments f
5b10: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  or function writ
5b20: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
5b30: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
5b40: 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45  ./* #define PAGE
5b50: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45  R_MJ_PGNO(x) (PE
5b60: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5b70: 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23  >pageSize)) */.#
5b80: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
5b90: 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e  PGNO(x) ((PENDIN
5ba0: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
5bb0: 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a  eSize))+1)../*.*
5bc0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
5bd0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
5be0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
5bf0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
5c00: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
5c10: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  647../*.** The p
5c20: 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64 20  agerEnter() and 
5c30: 70 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f 75  pagerLeave() rou
5c40: 74 69 6e 65 73 20 61 63 71 75 69 72 65 20 61 6e  tines acquire an
5c50: 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20 6d  d release.** a m
5c60: 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61 67  utex on each pag
5c70: 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20 69  er.  The mutex i
5c80: 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a  s recursive..**.
5c90: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 70 65  ** This is a spe
5ca0: 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74  cial-purpose mut
5cb0: 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72 6f  ex.  It only pro
5cc0: 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78 63  vides mutual exc
5cd0: 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65  lusion.** betwee
5ce0: 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e 64 20  n the Btree and 
5cf0: 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61 67  the Memory Manag
5d00: 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72 65  ement sqlite3_re
5d10: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a  lease_memory().*
5d20: 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  * function.  It 
5d30: 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e 74  does not prevent
5d40: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
5d50: 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20 61  wo Btrees from a
5d60: 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65 20  ccessing.** the 
5d70: 73 61 6d 65 20 70 61 67 65 72 20 61 74 20 74 68  same pager at th
5d80: 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f 74  e same time.  Ot
5d90: 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  her general-purp
5da0: 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a 2a  ose mutexes in.*
5db0: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
5dc0: 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63 68  r handle that ch
5dd0: 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ore..*/.#ifdef S
5de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
5df0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
5e00: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
5e10: 65 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a 70  erEnter(Pager *p
5e20: 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65  ){.    p->iInUse
5e30: 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  DB++;.    if( p-
5e40: 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d 3e  >iInUseMM && p->
5e50: 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a 20  iInUseDB==1 ){. 
5e60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
5e70: 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20 20  ex *mutex;.     
5e80: 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33   mutex = sqlite3
5e90: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
5ea0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
5eb0: 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20 70 2d  _MEM2);.      p-
5ec0: 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20  >iInUseDB = 0;. 
5ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
5ee0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
5ef0: 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65  .      p->iInUse
5f00: 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  DB = 1;.      sq
5f10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
5f20: 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  e(mutex);.    }.
5f30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
5f40: 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20  InUseMM==0 );.  
5f50: 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  }.  static void 
5f60: 70 61 67 65 72 4c 65 61 76 65 28 50 61 67 65 72  pagerLeave(Pager
5f70: 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e   *p){.    p->iIn
5f80: 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73 73  UseDB--;.    ass
5f90: 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44 42  ert( p->iInUseDB
5fa0: 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  >=0 );.  }.#else
5fb0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 45  .# define pagerE
5fc0: 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e 65  nter(X).# define
5fd0: 20 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a 23   pagerLeave(X).#
5fe0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  endif../*.** Add
5ff0: 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
6000: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b   end of the link
6010: 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  ed list managed 
6020: 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  by structure.** 
6030: 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f 6d  pList (pPg becom
6040: 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  es the last entr
6050: 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d 20  y in the list - 
6060: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6070: 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72 67  y .** used). Arg
6080: 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75  ument pLink shou
6090: 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68  ld point to eith
60a0: 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20  er pPg->free or 
60b0: 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64  pPg->gfree,.** d
60c0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
60d0: 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67  her pPg is being
60e0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61   added to the pa
60f0: 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 0a  ger-specific or.
6100: 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69  ** global LRU li
6110: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
6120: 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65 72  id listAdd(Pager
6130: 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  LruList *pList, 
6140: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
6150: 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ink, PgHdr *pPg)
6160: 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  {.  pLink->pNext
6170: 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70   = 0;.  pLink->p
6180: 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c  Prev = pList->pL
6190: 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ast;..#ifdef SQL
61a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
61b0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61  Y_MANAGEMENT.  a
61c0: 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50  ssert(pLink==&pP
61d0: 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b  g->free || pLink
61e0: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a  ==&pPg->gfree);.
61f0: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
6200: 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70  &pPg->gfree || p
6210: 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72  List!=&sqlite3Lr
6220: 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64  uPageList);.#end
6230: 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  if..  if( pList-
6240: 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e  >pLast ){.    in
6250: 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a  t iOff = (char *
6260: 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a  )pLink - (char *
6270: 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72 4c  )pPg;.    PagerL
6280: 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e  ruLink *pLastLin
6290: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
62a0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
62b0: 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d  st->pLast)[iOff]
62c0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b  );.    pLastLink
62d0: 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20  ->pNext = pPg;. 
62e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
62f0: 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72 73  rt(!pList->pFirs
6300: 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  t);.    pList->p
6310: 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d  First = pPg;.  }
6320: 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74  ..  pList->pLast
6330: 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21 70   = pPg;.  if( !p
6340: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6350: 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64 53  ed && pPg->needS
6360: 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ync==0 ){.    pL
6370: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
6380: 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a  d = pPg;.  }.}..
6390: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67  /*.** Remove pPg
63a0: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d   from the list m
63b0: 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73 74  anaged by the st
63c0: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
63d0: 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a  to by pList..**.
63e0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e  ** Argument pLin
63f0: 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  k should point t
6400: 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72  o either pPg->fr
6410: 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65  ee or pPg->gfree
6420: 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20  , depending .** 
6430: 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20 69  on whether pPg i
6440: 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  s being added to
6450: 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63 69   the pager-speci
6460: 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52  fic or global LR
6470: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6480: 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76  c void listRemov
6490: 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a  e(PagerLruList *
64a0: 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c  pList, PagerLruL
64b0: 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64  ink *pLink, PgHd
64c0: 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 69  r *pPg){.  int i
64d0: 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c  Off = (char *)pL
64e0: 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50  ink - (char *)pP
64f0: 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g;..#ifdef SQLIT
6500: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6510: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73  MANAGEMENT.  ass
6520: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
6530: 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d  >free || pLink==
6540: 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20  &pPg->gfree);.  
6550: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6560: 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69  Pg->gfree || pLi
6570: 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50  st!=&sqlite3LruP
6580: 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  ageList);.#endif
6590: 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  ..  if( pPg==pLi
65a0: 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20  st->pFirst ){.  
65b0: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20    pList->pFirst 
65c0: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
65d0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
65e0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20  List->pLast ){. 
65f0: 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20     pList->pLast 
6600: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6610: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
6620: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50 61  >pPrev ){.    Pa
6630: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65  gerLruLink *pPre
6640: 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  vLink = (PagerLr
6650: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
6660: 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69  )pLink->pPrev)[i
6670: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65 76  Off]);.    pPrev
6680: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Link->pNext = pL
6690: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ink->pNext;.  }.
66a0: 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65    if( pLink->pNe
66b0: 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c  xt ){.    PagerL
66c0: 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e  ruLink *pNextLin
66d0: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
66e0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
66f0: 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d  nk->pNext)[iOff]
6700: 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b  );.    pNextLink
6710: 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d  ->pPrev = pLink-
6720: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6730: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46  ( pPg==pList->pF
6740: 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
6750: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c 69    PgHdr *p = pLi
6760: 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77  nk->pNext;.    w
6770: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
6780: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
6790: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c  PagerLruLink *pL
67a0: 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b   = (PagerLruLink
67b0: 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b 69   *)(&((u8 *)p)[i
67c0: 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d  Off]);.      p =
67d0: 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pL->pNext;.    
67e0: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  }.    pList->pFi
67f0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
6800: 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65   }..  pLink->pNe
6810: 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  xt = pLink->pPre
6820: 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  v = 0;.}../* .**
6830: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
6840: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   the list of fre
6850: 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65 20  e pages for the 
6860: 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65  pager. If .** me
6870: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
6880: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f  is enabled, also
6890: 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
68a0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20   the global .** 
68b0: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
68c0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
68d0: 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50 67  id lruListAdd(Pg
68e0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73  Hdr *pPg){.  lis
68f0: 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67 65  tAdd(&pPg->pPage
6900: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6910: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6920: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6930: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6940: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6950: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6960: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6970: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6980: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6990: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
69a0: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64 64  U));.    listAdd
69b0: 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  (&sqlite3LruPage
69c0: 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65  List, &pPg->gfre
69d0: 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c  e, pPg);.    sql
69e0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
69f0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6a00: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6a10: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6a20: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6a30: 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67 65   .** Remove page
6a40: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
6a50: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6a60: 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69 61   for the associa
6a70: 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49 66  ted pager..** If
6a80: 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
6a90: 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  nt is enabled, a
6aa0: 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20 66  lso remove pPg f
6ab0: 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c  rom the global l
6ac0: 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20 70  ist.** of free p
6ad0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6ae0: 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d 6f  void lruListRemo
6af0: 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ve(PgHdr *pPg){.
6b00: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70 50    listRemove(&pP
6b10: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6b20: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6b30: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6b40: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6b50: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6b60: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6b70: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6b80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6b90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6ba0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6bb0: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
6bc0: 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71 6c   listRemove(&sql
6bd0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c  ite3LruPageList,
6be0: 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50   &pPg->gfree, pP
6bf0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
6c00: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6c10: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6c20: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6c30: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6c40: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
6c50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6c60: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66 74   called just aft
6c70: 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  er the needSync 
6c80: 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63 6c  flag has been cl
6c90: 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 6c  eared.** from al
6ca0: 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64 20  l pages managed 
6cb0: 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61 6c  by pPager (usual
6cc0: 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6a  ly because the j
6cd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
6ce0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79 6e  as just been syn
6cf0: 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65 73  ced). It updates
6d00: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72 75   the pPager->lru
6d10: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76 61  .pFirstSynced va
6d20: 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20 69  riable.** and, i
6d30: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6d40: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6d50: 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50 61  the sqlite3LruPa
6d60: 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
6d70: 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ced.** variable 
6d80: 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  also..*/.static 
6d90: 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74 46  void lruListSetF
6da0: 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65 72  irstSynced(Pager
6db0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61   *pPager){.  pPa
6dc0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6dd0: 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
6de0: 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66 64  lru.pFirst;.#ifd
6df0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6e00: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6e10: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  NT.  if( !pPager
6e20: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50  ->memDb ){.    P
6e30: 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71 6c  gHdr *p;.    sql
6e40: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6e50: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6e60: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6e70: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6e80: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
6e90: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
6ea0: 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65 65  rst; p && p->nee
6eb0: 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72 65  dSync; p=p->gfre
6ec0: 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61 73  e.pNext);.    as
6ed0: 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d 3e  sert(p==pPager->
6ee0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
6ef0: 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c 72   || p==sqlite3Lr
6f00: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
6f10: 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71 6c  Synced);.    sql
6f20: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
6f30: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
6f40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
6f50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
6f60: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
6f70: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
6f80: 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e  C_LRU));.  }.#en
6f90: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
6fa0: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
6fb0: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
6fc0: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
6fd0: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
6fe0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
6ff0: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
7000: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
7010: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
7020: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
7030: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
7040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7050: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
7060: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7070: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7080: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
7090: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
70a0: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
70b0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
70c0: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
70d0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
70e0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
70f0: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
7100: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
7110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7120: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7130: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
7140: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
7150: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
7160: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
7170: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
7180: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
7190: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
71a0: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
71b0: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
71c0: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
71d0: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66 64  N-1))==0 );.#ifd
71e0: 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43  ef SQLITE_MALLOC
71f0: 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69 66  _SOFT_LIMIT.  if
7200: 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73 68  ( N*sizeof(aHash
7210: 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c 4c  [0])>SQLITE_MALL
7220: 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29 7b  OC_SOFT_LIMIT ){
7230: 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54 45 5f  .    N = SQLITE_
7240: 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49  MALLOC_SOFT_LIMI
7250: 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  T/sizeof(aHash[0
7260: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 3d  ]);.  }.  if( N=
7270: 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29  =pPager->nHash )
7280: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
7290: 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
72a0: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ger);.  sqlite3F
72b0: 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c 49 54  aultBenign(SQLIT
72c0: 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f  E_FAULTINJECTOR_
72d0: 4d 41 4c 4c 4f 43 2c 20 70 50 61 67 65 72 2d 3e  MALLOC, pPager->
72e0: 61 48 61 73 68 21 3d 30 29 3b 0a 20 20 61 48 61  aHash!=0);.  aHa
72f0: 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sh = sqlite3Mall
7300: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61  ocZero( sizeof(a
7310: 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20  Hash[0])*N );.  
7320: 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e 69  sqlite3FaultBeni
7330: 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49  gn(SQLITE_FAULTI
7340: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20  NJECTOR_MALLOC, 
7350: 30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  0);.  pagerEnter
7360: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
7370: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
7380: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
7390: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
73a0: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
73b0: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
73c0: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
73d0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
73e0: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
73f0: 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d  Hash);.  pPager-
7400: 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50  >nHash = N;.  pP
7410: 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48  ager->aHash = aH
7420: 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  ash;.  for(pPg=p
7430: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
7440: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
7450: 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b  All){.    int h;
7460: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
7470: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  no==0 ){.      a
7480: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
7490: 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
74a0: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
74b0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
74c0: 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70  .    }.    h = p
74d0: 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29  Pg->pgno & (N-1)
74e0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
74f0: 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b  Hash = aHash[h];
7500: 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68  .    if( aHash[h
7510: 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68  ] ){.      aHash
7520: 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
7530: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
7540: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
7550: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
7560: 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  sh = 0;.  }.}../
7570: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
7580: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
7590: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
75a0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
75b0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
75c0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
75d0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
75e0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
75f0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
7600: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
7610: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
7620: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
7630: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
7640: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
7650: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
7660: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
7670: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
7680: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
7690: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
76a0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
76b0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
76c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
76d0: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
76e0: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
76f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7700: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
7710: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
7720: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
7730: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7740: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
7750: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
7760: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
7770: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
7780: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
7790: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
77a0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
77b0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a  te((u8*)A,B)../*
77c0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
77d0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
77e0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
77f0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
7800: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
7810: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
7820: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
7830: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
7840: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
7850: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
7860: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
7870: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
7880: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
7890: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
78a0: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
78b0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
78c0: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
78d0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
78e0: 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f  If file pFd is o
78f0: 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  pen, call sqlite
7900: 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69  3OsUnlock() on i
7910: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
7920: 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65   osUnlock(sqlite
7930: 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74  3_file *pFd, int
7940: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21   eLock){.  if( !
7950: 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  pFd->pMethods ){
7960: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7970: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
7980: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
7990: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
79a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
79b0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
79c0: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
79d0: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
79e0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
79f0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
7a00: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
7a10: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
7a20: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
7a30: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
7a40: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
7a50: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
7a60: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
7a70: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
7a80: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
7a90: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
7aa0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
7ab0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
7ac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
7ad0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
7ae0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
7af0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
7b00: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
7b10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
7b20: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
7b30: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
7b40: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
7b50: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
7b60: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
7b70: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
7b80: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7b90: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
7ba0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
7bb0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
7bc0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
7bd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7be0: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
7bf0: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
7c00: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
7c10: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
7c20: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
7c30: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
7c40: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
7c50: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
7c60: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
7c70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
7c80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7c90: 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  size */.  sqlite
7ca0: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
7cb0: 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20  ger->fd;..  if( 
7cc0: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
7cd0: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
7ce0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
7cf0: 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20  ristics(fd);.   
7d00: 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nSector = sqlit
7d10: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
7d20: 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20  d);.    nPage = 
7d30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7d40: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
7d50: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
7d60: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
7d70: 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  );.  assert(SQLI
7d80: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
7d90: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
7da0: 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65  ..  if( !fd->pMe
7db0: 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53 51  thods || (dc&(SQ
7dc0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
7dd0: 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26 6e  C|(nPage>>8))&&n
7de0: 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20 29  Sector<=nPage) )
7df0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55  {.    return JOU
7e00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7e10: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
7e20: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
7e30: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
7e40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
7e50: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7e60: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
7e70: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7e80: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
7e90: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
7ea0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
7eb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7ec0: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
7ed0: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
7ee0: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
7ef0: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
7f00: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
7f10: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
7f20: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7f30: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
7f40: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
7f50: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
7f60: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
7f70: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
7f80: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
7f90: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
7fa0: 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45  RRUPT, or SQLITE
7fb0: 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72  _FULL.** the err
7fc0: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
7fd0: 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65  stent. Until the
7fe0: 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72   persisten error
7ff0: 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20   is cleared,.** 
8000: 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63  subsequent API c
8010: 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67  alls on this Pag
8020: 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
8030: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
8040: 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  ame .** error co
8050: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73  de..**.** A pers
8060: 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64  istent error ind
8070: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
8080: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
8090: 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
80a0: 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
80b0: 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
80c0: 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
80d0: 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
80e0: 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
80f0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
8100: 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
8110: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
8120: 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
8130: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
8140: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65  ror occured, the
8150: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
8160: 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
8170: 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
8180: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
8190: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
81a0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73  ager *pPager);.s
81b0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
81c0: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
81d0: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
81e0: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
81f0: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  xff;.  assert(. 
8200: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
8210: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
8220: 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
8230: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
8240: 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
8250: 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
8260: 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
8270: 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
8280: 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c  if(.    rc2==SQL
8290: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
82a0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
82b0: 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  R ||.    rc2==SQ
82c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29  LITE_CORRUPT.  )
82d0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
82e0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
82f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8300: 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
8310: 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
8320: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
8330: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
8340: 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c  lready unlocked,
8350: 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f   call pager_unlo
8360: 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20  ck() now to.    
8370: 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65    ** clear the e
8380: 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65  rror state and e
8390: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70  nsure that the p
83a0: 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20  ager-cache is . 
83b0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65       ** complete
83c0: 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20  ly empty..      
83d0: 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75  */.      pager_u
83e0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
83f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8400: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
8410: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
8420: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
8430: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
8440: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
8450: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
8460: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
8470: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
8480: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
8490: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
84a0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
84b0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
84c0: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
84d0: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
84e0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
84f0: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
8500: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
8510: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
8520: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
8530: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
8540: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
8550: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
8560: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
8570: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
8580: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
8590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
85a0: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
85b0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
85c0: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
85d0: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
85e0: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
85f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
8600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8610: 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e           (unsign
8620: 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f  ed char *)PGHDR_
8630: 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b  TO_DATA(pPage));
8640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
8650: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
8660: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
8670: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
8680: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8690: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
86a0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
86b0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
86c0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
86d0: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
86e0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
86f0: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
8700: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
8710: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
8720: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
8730: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
8740: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
8750: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
8760: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
8770: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
8780: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
8790: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
87a0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
87b0: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
87c0: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
87d0: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
87e0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
87f0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
8800: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
8810: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
8820: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
8830: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
8840: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
8850: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
8860: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  dif../*.** When 
8870: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
8880: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8890: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
88a0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
88b0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
88c0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
88d0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
88e0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
88f0: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
8900: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
8910: 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  lied by the call
8920: 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  er. .**.** zMast
8930: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
8940: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
8950: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
8960: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
8970: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
8980: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
8990: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
89a0: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
89b0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
89c0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
89d0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
89e0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
89f0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
8a00: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
8a10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
8a20: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
8a30: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
8a40: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
8a50: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
8a60: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
8a70: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
8a80: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
8a90: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
8aa0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
8ab0: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
8ac0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
8ad0: 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73   is present zMas
8ae0: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
8af0: 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45   0 and.** SQLITE
8b00: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
8b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
8b20: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
8b30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
8b40: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
8b50: 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a  , int nMaster){.
8b60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
8b70: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
8b80: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
8b90: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
8ba0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
8bb0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
8bc0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
8bd0: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73  eader */..  zMas
8be0: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
8bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8c00: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
8c10: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
8c20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
8c30: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
8c40: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
8c50: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
8c60: 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  16, &len);.  if(
8c70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8c80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
8c90: 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  f( len>=nMaster 
8ca0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8cb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
8cc0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8cd0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
8ce0: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
8cf0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8d00: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
8d10: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
8d20: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
8d30: 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72   szJ-8);.  if( r
8d40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8d50: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
8d60: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
8d70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8d80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
8d90: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
8da0: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
8db0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
8dc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8dd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8de0: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
8df0: 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65   '\0';..  /* See
8e00: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
8e10: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
8e20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8e30: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8e40: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
8e50: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
8e60: 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20  [i];.   }.  if( 
8e70: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
8e80: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
8e90: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
8ea0: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
8eb0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
8ec0: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
8ed0: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
8ee0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
8ef0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
8f00: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
8f10: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
8f20: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
8f30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8f40: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
8f50: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
8f60: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
8f70: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
8f80: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
8f90: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
8fa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8fb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
8fc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
8fd0: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
8fe0: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
8ff0: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
9000: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
9010: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
9020: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
9030: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
9040: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
9050: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
9060: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
9070: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
9080: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
9090: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
90a0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
90b0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
90e0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
90f0: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
9100: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
9110: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
9120: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
9130: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
9140: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
9150: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
9160: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ** .*/.static vo
9170: 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  id seekJournalHd
9180: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
9190: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
91a0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
91b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
91c0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
91d0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
91e0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
91f0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
9200: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9210: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
9220: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
9230: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9240: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
9250: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
9260: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
9270: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
9280: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
9290: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
92a0: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a  Off = offset;.}.
92b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
92c0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
92d0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
92e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
92f0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
9300: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
9310: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
9320: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
9330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
9340: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
9350: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
9360: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
9370: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9380: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
9390: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
93a0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
93b0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
93c0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
93d0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
93e0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
93f0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
9400: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
9410: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
9420: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
9430: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
9440: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
9450: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
9460: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
9470: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
9480: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
9490: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
94a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
94b0: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
94c0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
94d0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
94e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
94f0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
9500: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
9510: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
9520: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
9530: 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20  pPager){.  char 
9540: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9550: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
9560: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
9570: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
9580: 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  HdrOff==0 ){.   
9590: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
95a0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
95b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20  urnalOff;.  }.. 
95c0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
95d0: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
95e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
95f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9600: 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48  ff;..  memcpy(zH
9610: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
9620: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
9630: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
9640: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
9650: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
9660: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
9670: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
9680: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
9690: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
96a0: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
96b0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
96c0: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
96d0: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
96e0: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
96f0: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
9700: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
9710: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
9720: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
9730: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
9740: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
9750: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
9760: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
9770: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
9780: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
9790: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
97a0: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
97b0: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
97c0: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
97d0: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
97e0: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
97f0: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
9800: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
9810: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
9820: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
9830: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9840: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
9850: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
9860: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
9870: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
9880: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
9890: 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
98a0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
98b0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
98c0: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
98d0: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
98e0: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
98f0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
9900: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
9910: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
9920: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
9930: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
9940: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
9950: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
9960: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
9970: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
9980: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
9990: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
99a0: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
99b0: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
99c0: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
99d0: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
99e0: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
99f0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
9a00: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
9a10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9a20: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
9a30: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
9a40: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e  thods||pPager->n
9a50: 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70  oSync);.  if( (p
9a60: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 0a  Pager->noSync) .
9a70: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
9a80: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
9a90: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
9aa0: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
9ab0: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
9ac0: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
9ad0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9ae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
9af0: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
9b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32  }else{.    put32
9b10: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
9b20: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9b30: 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  ic)], 0);.  }.. 
9b40: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
9b50: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
9b60: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
9b70: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
9b80: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
9b90: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
9ba0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
9bb0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
9bc0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
9bd0: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
9be0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
9bf0: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
9c00: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
9c10: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
9c20: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9c30: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
9c40: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ], pPager->dbSiz
9c50: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
9c60: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
9c70: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
9c80: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
9c90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
9ca0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
9cb0: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
9cc0: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
9cd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
9ce0: 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  dr==0 ){.    /* 
9cf0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
9d00: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
9d10: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9d20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
9d30: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
9d40: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 49 4f 54 52  ize);.  }.  IOTR
9d50: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
9d60: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
9d70: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
9d80: 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  lHdr, sizeof(zHe
9d90: 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20 73  ader))).  rc = s
9da0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
9db0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
9dc0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
9dd0: 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er),pPager->jour
9de0: 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65  nalOff);.  pPage
9df0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9e00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9e10: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 54  pPager);..  /* T
9e20: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9e30: 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  r has been writt
9e40: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  en successfully.
9e50: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
9e60: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63  l.  ** file desc
9e70: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e  riptor to the en
9e80: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
9e90: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
9ea0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
9eb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9ec0: 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20  IOTRACE(("JTAIL 
9ed0: 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
9ee0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
9ef0: 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72  nalOff-1)).    r
9f00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9f10: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9f20: 22 5c 30 30 30 22 2c 20 31 2c 20 70 50 61 67 65  "\000", 1, pPage
9f30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
9f40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9f50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
9f60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9f70: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
9f80: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
9f90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9fa0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
9fb0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
9fc0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
9fd0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
9fe0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
9ff0: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
a000: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
a010: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
a020: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
a030: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
a040: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
a050: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
a060: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
a070: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
a080: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
a090: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
a0a0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
a0b0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
a0c0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
a0d0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
a0e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
a0f0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
a100: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a110: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
a120: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
a130: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
a140: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
a150: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
a160: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
a170: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
a180: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
a190: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
a1a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
a1b0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
a1c0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
a1d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
a1e0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
a1f0: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
a200: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
a210: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
a220: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
a230: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
a240: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
a250: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
a260: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
a270: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
a280: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
a290: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
a2a0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
a2b0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
a2c0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
a2d0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
a2e0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
a2f0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
a300: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
a310: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
a320: 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e 74 20   jrnlOff;.  int 
a330: 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73 65  iPageSize;..  se
a340: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
a350: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
a360: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
a370: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
a380: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
a390: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
a3a0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
a3b0: 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70   }.  jrnlOff = p
a3c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a3d0: 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  f;..  rc = sqlit
a3e0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
a3f0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
a400: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72  zeof(aMagic), jr
a410: 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63  nlOff);.  if( rc
a420: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a430: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f  jrnlOff += sizeo
a440: 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66  f(aMagic);..  if
a450: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
a460: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a470: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
a480: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a490: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
a4a0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
a4b0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a4c0: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63  , jrnlOff, pNRec
a4d0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a4e0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
a4f0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
a500: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
a510: 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  +4, &pPager->cks
a520: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
a530: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
a540: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a550: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a560: 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a  rnlOff+8, pDbSiz
a570: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
a580: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
a590: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a5a0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a5b0: 66 2b 31 36 2c 20 28 75 33 32 20 2a 29 26 69 50  f+16, (u32 *)&iP
a5c0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
a5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
a5e0: 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3e 3d    && iPageSize>=
a5f0: 35 31 32 20 0a 20 20 20 26 26 20 69 50 61 67 65  512 .   && iPage
a600: 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
a610: 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 26  _PAGE_SIZE .   &
a620: 26 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  & ((iPageSize-1)
a630: 26 69 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 0a  &iPageSize)==0 .
a640: 20 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67    ){.    u16 pag
a650: 65 73 69 7a 65 20 3d 20 69 50 61 67 65 53 69 7a  esize = iPageSiz
a660: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
a670: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
a680: 69 7a 65 28 70 50 61 67 65 72 2c 20 26 70 61 67  ize(pPager, &pag
a690: 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66  esize);.  }.  if
a6a0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a6b0: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
a6c0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a6d0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a6e0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a6f0: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
a700: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
a710: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
a720: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
a730: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
a740: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
a750: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
a760: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a770: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
a780: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
a790: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
a7a0: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
a7b0: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
a7c0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
a7d0: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
a7e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
a7f0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
a800: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a810: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a820: 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26  Off+12, (u32 *)&
a830: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a840: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
a850: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
a860: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a870: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
a880: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
a890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a8a0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a8b0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a8c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a8d0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a8e0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a8f0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a900: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a910: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a920: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a930: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a940: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a950: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a960: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a970: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a980: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a990: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a9a0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a9b0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a9c0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a9d0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a9e0: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a9f0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
aa00: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
aa10: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
aa20: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
aa30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
aa40: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
aa50: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
aa60: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
aa70: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
aa80: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
aa90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
aaa0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
aab0: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
aac0: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
aad0: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
aae0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
aaf0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
ab00: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
ab10: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
ab20: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
ab30: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
ab40: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
ab50: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
ab60: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
ab70: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
ab80: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
ab90: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
aba0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
abb0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
abc0: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
abd0: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
abe0: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
abf0: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
ac00: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ac10: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
ac20: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
ac30: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
ac40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ac50: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
ac60: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
ac70: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
ac80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
ac90: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
aca0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
acb0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
acc0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
acd0: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
ace0: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
acf0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
ad00: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
ad10: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
ad20: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
ad30: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
ad40: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
ad50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
ad60: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
ad70: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
ad80: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
ad90: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
ada0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
adb0: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
adc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
add0: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
ade0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
adf0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
ae00: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
ae10: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
ae20: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
ae30: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
ae40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ae50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
ae60: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
ae70: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ae80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
ae90: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
aea0: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
aeb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
aec0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
aed0: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
aee0: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
aef0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
af00: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
af10: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
af20: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
af30: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
af40: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
af50: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
af60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
af70: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
af80: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
af90: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
afa0: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
afb0: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65  er->noSync;.  re
afc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
afd0: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
afe0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
aff0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
b000: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
b010: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
b020: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
b030: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
b040: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
b050: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
b060: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
b070: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b080: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
b090: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ps the sqlite3Pa
b0a0: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a  gerStmtCommit().
b0b0: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
b0c0: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
b0d0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
b0e0: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
b0f0: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
b100: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
b110: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
b120: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
b130: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
b140: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
b150: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
b160: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b170: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b180: 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79  ger;.  PgHistory
b190: 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
b1a0: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
b1b0: 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
b1c0: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
b1d0: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b  pHist->inStmt ){
b1e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69  .    assert( pHi
b1f0: 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30  st->pPrevStmt==0
b200: 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74   && pHist->pNext
b210: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Stmt==0 );.    i
b220: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
b230: 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f   ){.      PGHDR_
b240: 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e  TO_HIST(pPager->
b250: 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e  pStmt, pPager)->
b260: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
b270: 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74  .    }.    pHist
b280: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
b290: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  ager->pStmt;.   
b2a0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
b2b0: 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d   pPg;.    pHist-
b2c0: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
b2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b2e0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b2f0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b300: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
b310: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
b320: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
b330: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
b340: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
b350: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
b360: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
b370: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
b380: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28   PgHdr *p;.  if(
b390: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d   pPager->aHash==
b3a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b3b0: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
b3c0: 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  h[pgno & (pPager
b3d0: 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77  ->nHash-1)];.  w
b3e0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
b3f0: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
b400: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
b410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
b430: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
b440: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
b450: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
b460: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
b470: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
b480: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
b490: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
b4a0: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
b4b0: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
b4c0: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
b4d0: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
b4e0: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
b4f0: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
b500: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
b510: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
b520: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b530: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b540: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
b550: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
b560: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
b570: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
b580: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
b590: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
b5a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52  pNext){.    IOTR
b5b0: 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
b5c0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
b5d0: 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
b5e0: 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
b5f0: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
b600: 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78  count);.    pNex
b610: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
b620: 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65  l;.    lruListRe
b630: 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20 73  move(pPg);.    s
b640: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d  qlite3_free(pPg-
b650: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  >pData);.    sql
b660: 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
b670: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70 50 61    }.  assert(pPa
b680: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d  ger->lru.pFirst=
b690: 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  =0);.  assert(pP
b6a0: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
b6b0: 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20 61 73  Synced==0);.  as
b6c0: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
b6d0: 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20 70 50  .pLast==0);.  pP
b6e0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
b6f0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
b700: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
b710: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 70 50 61  Dirty = 0;.  pPa
b720: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
b730: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b740: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
b750: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
b760: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   0;.  pPager->aH
b770: 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ash = 0;.  pPage
b780: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a  r->nRef = 0;.}..
b790: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b7a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
b7b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b7c0: 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
b7d0: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   in error state,
b7e0: 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   discard the con
b7f0: 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65  tents of .** the
b800: 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74   cache and reset
b810: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
b820: 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74  ture internal st
b830: 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ate. If there is
b840: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72  .** an open jour
b850: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74  nal-file, then t
b860: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73  he next time a s
b870: 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62  hared-lock is ob
b880: 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  tained.** on the
b890: 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20   pager file (by 
b8a0: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
b8b0: 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77  r process), it w
b8c0: 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65  ill be.** treate
b8d0: 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
b8e0: 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
b8f0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
b900: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
b910: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b920: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
b930: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
b940: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
b950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
b960: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
b970: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
b980: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 70        if( rc ) p
b990: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
b9a0: 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
b9b0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
b9c0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
b9d0: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
b9e0: 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a  ager))..      /*
b9f0: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
ba00: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
ba10: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
ba20: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
ba30: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75   be.      ** tru
ba40: 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
ba50: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
ba60: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63   unlocked, the c
ba70: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
ba80: 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61       ** cache ca
ba90: 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61  n be discarded a
baa0: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
bab0: 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64  e safely cleared
bac0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bad0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
bae0: 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
baf0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bb00: 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  K ) pPager->errC
bb10: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
bb20: 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
bb30: 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
bb40: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
bb50: 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
bb60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
bb70: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
bb80: 74 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tfd);.          
bb90: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
bba0: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
bbb0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
bbc0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
bbd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
bbe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
bbf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
bc00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
bc10: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
bc20: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
bc30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bc40: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
bc50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
bc60: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
bc70: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
bc80: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
bc90: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
bca0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
bcb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
bcc0: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  tOpen = 0;.     
bcd0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
bce0: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  nUse = 0;.      
bcf0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bd00: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
bd10: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bd20: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
bd30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
bd40: 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
bd50: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bd60: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a  origDbSize = 0;.
bd70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
bd80: 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c     if( !MEMDB ||
bd90: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
bda0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bdb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
bdc0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
bdd0: 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  K;.      pPager-
bde0: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
bdf0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
be00: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
be10: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
be20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
be30: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
be40: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
be50: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
be60: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
be70: 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72  y entered the er
be80: 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64  ror state, .** d
be90: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68  o not attempt th
bea0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e rollback..*/.s
beb0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
bec0: 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
bed0: 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 61  k(Pager *p){.  a
bee0: 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
bef0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
bf00: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  || p->journalOpe
bf10: 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  n==0 );.  if( p-
bf20: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
bf30: 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e  _OK && p->state>
bf40: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
bf50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
bf60: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  gerRollback(p);.
bf70: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
bf80: 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  ck(p);.  assert(
bf90: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
bfa0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  p->journalOpen |
bfb0: 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d  | (p->exclusiveM
bfc0: 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c  ode&&!p->journal
bfd0: 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Off) );.  assert
bfe0: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
bff0: 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20  !p->stmtOpen || 
c000: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
c010: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   );.}../*.** Thi
c020: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
c030: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41   transaction.  A
c040: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
c050: 65 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a  ended by either.
c060: 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  ** a COMMIT or a
c070: 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a   ROLLBACK..**.**
c080: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
c090: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
c0a0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
c0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
c0c0: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
c0d0: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
c0e0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
c0f0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
c100: 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73  tine will releas
c110: 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
c120: 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69  e lock and acqui
c130: 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  res a SHARED loc
c140: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69  k in its place i
c150: 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65  f that is.** the
c160: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69   appropriate thi
c170: 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61  ng to do.  Relea
c180: 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79  se locks usually
c190: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c   is appropriate,
c1a0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72  .** unless we ar
c1b0: 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61  e in exclusive a
c1c0: 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e  ccess mode or un
c1d0: 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a  less this is a .
c1e0: 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45  ** COMMIT AND BE
c1f0: 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  GIN or ROLLBACK 
c200: 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74  AND BEGIN operat
c210: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ion..**.** The j
c220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65  ournal file is e
c230: 69 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72  ither deleted or
c240: 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a   truncated..**.*
c250: 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72  * TODO: Consider
c260: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75   keeping the jou
c270: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66  rnal file open f
c280: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
c290: 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20  abases..** This 
c2a0: 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
c2b0: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
c2c0: 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ment on windows 
c2d0: 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  where opening.**
c2e0: 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78   a file is an ex
c2f0: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
c300: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
c310: 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
c320: 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
c330: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
c340: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
c350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
c360: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
c370: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
c380: 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
c390: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
c3a0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c3b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c3c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
c3d0: 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
c3e0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
c3f0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26  ager->stmtOpen &
c400: 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  & !pPager->exclu
c410: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
c420: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c430: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
c440: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
c450: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
c460: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c470: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  lOpen ){.    if(
c480: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
c490: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20 20 20  veMode .        
c4a0: 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
c4b0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
c4c0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53  ger->jfd, 0))==S
c4d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20  QLITE_OK ){;.   
c4e0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c4f0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
c500: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c510: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
c520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
c530: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c540: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
c550: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c560: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
c570: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c580: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
c590: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
c5a0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
c5b0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
c5c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c5d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
c5e0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
c5f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
c600: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
c610: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
c620: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
c630: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
c640: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
c650: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
c660: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
c670: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
c680: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
c690: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
c6a0: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
c6b0: 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ack = 0;.#ifdef 
c6c0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c6d0: 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
c6e0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c6f0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
c700: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
c710: 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
c720: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
c730: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
c740: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
c750: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
c760: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c770: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
c780: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c790: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
c7a0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
c7b0: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
c7c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
c7d0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c7e0: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
c7f0: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
c800: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
c810: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
c820: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
c830: 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  RED;.  }else if(
c840: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
c850: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
c860: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
c870: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
c880: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
c890: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
c8a0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
c8b0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
c8c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
c8d0: 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65 74   0;.  lruListSet
c8e0: 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67  FirstSynced(pPag
c8f0: 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  er);.  pPager->d
c900: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
c910: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
c920: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
c930: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
c940: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
c950: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
c960: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
c970: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
c980: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
c990: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
c9a0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c9b0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
c9c0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
c9d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
c9e0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
c9f0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
ca00: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
ca10: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
ca20: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
ca30: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
ca40: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
ca50: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
ca60: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
ca70: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
ca80: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
ca90: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
caa0: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
cab0: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
cac0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
cad0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
cae0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
caf0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
cb00: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
cb10: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
cb20: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
cb30: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
cb40: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
cb50: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
cb60: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
cb70: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
cb80: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
cb90: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
cba0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
cbb0: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
cbc0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
cbd0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
cbe0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
cbf0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
cc00: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
cc10: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
cc20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
cc30: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
cc40: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
cc50: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
cc60: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
cc70: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
cc80: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
cc90: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
cca0: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
ccb0: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
ccc0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
ccd0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
cce0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
ccf0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
cd00: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
cd10: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
cd20: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
cd30: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
cd40: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
cd50: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
cd60: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
cd70: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
cd80: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
cd90: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
cda0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
cdb0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
cdc0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
cdd0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
cde0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
cdf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
ce00: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
ce10: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
ce20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
ce30: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
ce40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
ce50: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
ce60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ce70: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
ce80: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
ce90: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
cea0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
ceb0: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
cec0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
ced0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
cee0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
cef0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
cf00: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
cf10: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
cf20: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
cf30: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
cf40: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
cf50: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
cf60: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
cf70: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
cf80: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
cf90: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
cfa0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
cfb0: 64 2c 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c  d,.  i64 offset,
cfc0: 0a 20 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a  .  int useCksum.
cfd0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
cfe0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d000: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
d010: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
d020: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
d050: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
d060: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d070: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
d080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d090: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
d0a0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
d0b0: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20   */.  u8 *aData 
d0c0: 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
d0d0: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20  pTmpSpace;   /* 
d0e0: 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72  Temp storage for
d0f0: 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a   a page */..  /*
d100: 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64   useCksum should
d110: 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65   be true for the
d120: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
d130: 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a  d false for.  **
d140: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d150: 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  als.  Verify tha
d160: 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73  t this is always
d170: 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20   the case.  */. 
d180: 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20   assert( jfd == 
d190: 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67  (useCksum ? pPag
d1a0: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
d1b0: 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73  ->stfd) );.  ass
d1c0: 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20  ert( aData );.. 
d1d0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
d1e0: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70  (jfd, offset, &p
d1f0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
d200: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
d210: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
d220: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
d230: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
d240: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
d250: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
d260: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
d270: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
d280: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
d290: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
d2a0: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
d2b0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
d2c0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
d2d0: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
d2e0: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
d2f0: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
d300: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
d310: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
d320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
d330: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
d340: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
d350: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
d360: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
d370: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
d380: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
d390: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
d3a0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
d3b0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
d3c0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
d3d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
d3e0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
d3f0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
d400: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d410: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
d420: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
d430: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
d440: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
d450: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d460: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
d470: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
d480: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
d490: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
d4a0: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
d4b0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
d4c0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
d4d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d4e0: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
d4f0: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
d500: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
d510: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d520: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
d530: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
d540: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
d550: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
d560: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
d570: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
d580: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
d590: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
d5a0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
d5b0: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
d5c0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
d5d0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
d5e0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
d5f0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
d600: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
d610: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
d620: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d630: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
d640: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
d650: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
d660: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
d670: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
d680: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
d690: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
d6a0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
d6b0: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
d6c0: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
d6d0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
d6e0: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
d6f0: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
d700: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
d710: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
d720: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
d730: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
d740: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
d750: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
d760: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
d770: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
d780: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
d790: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
d7a0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
d7b0: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
d7c0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
d7d0: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
d7e0: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
d7f0: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
d800: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
d810: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
d820: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
d830: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
d840: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
d850: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
d860: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
d870: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
d880: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d890: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
d8a0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
d8b0: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
d8c0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
d8d0: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
d8e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
d8f0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
d900: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
d910: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
d920: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
d930: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
d940: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
d950: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
d960: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
d970: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
d980: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
d990: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
d9a0: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
d9b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
d9c0: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
d9d0: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
d9e0: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
d9f0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
da00: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
da10: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
da20: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
da30: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
da40: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
da50: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
da60: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
da70: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
da80: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
da90: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
daa0: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
dab0: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
dac0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
dad0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
dae0: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
daf0: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
db00: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
db10: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
db20: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
db30: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
db40: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
db50: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
db60: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
db70: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
db80: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
db90: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
dba0: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
dbb0: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
dbc0: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
dbd0: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
dbe0: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
dbf0: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f  eedSync==0..  */
dc00: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
dc10: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
dc20: 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  no);.  PAGERTRAC
dc30: 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E4("PLAYBACK %d 
dc40: 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
dc50: 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
dc60: 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
dc70: 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
dc80: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
dc90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44  er->pageSize, aD
dca0: 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50 61  ata));.  if( pPa
dcb0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
dcc0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
dcd0: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
dce0: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
dcf0: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
dd00: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
dd10: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
dd20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dd30: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
dd40: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
dd50: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
dd60: 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  set);.    if( pP
dd70: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
dd80: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
dd90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
dda0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
ddb0: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
ddc0: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
ddd0: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
dde0: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
ddf0: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
de00: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
de10: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
de20: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
de30: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
de40: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
de50: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
de60: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
de70: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
de80: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
de90: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
dea0: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
deb0: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
dec0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
ded0: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
dee0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
def0: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
df00: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
df10: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
df20: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
df30: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
df40: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
df50: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
df60: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
df70: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
df80: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
df90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
dfa0: 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50  Reiniter(pPg, pP
dfb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
dfc0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
dfd0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
dfe0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
dff0: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
e000: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
e010: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
e020: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
e030: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
e040: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
e050: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
e060: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
e070: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
e080: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
e090: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
e0a0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
e0b0: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
e0c0: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
e0d0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
e0e0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e0f0: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
e100: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
e110: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
e120: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
e130: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
e140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
e160: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
e170: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
e180: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e190: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
e1a0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
e1b0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
e1c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e1d0: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
e1e0: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
e1f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e200: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
e210: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
e220: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
e230: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
e240: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
e250: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
e260: 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
e270: 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
e280: 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
e290: 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
e2a0: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
e2b0: 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
e2c0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
e2d0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
e2e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
e2f0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
e300: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
e310: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
e320: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
e330: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
e340: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
e350: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
e360: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
e370: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
e380: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
e390: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
e3a0: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
e3b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
e3c0: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
e3d0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
e3e0: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
e3f0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
e400: 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
e410: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
e420: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
e430: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
e440: 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
e450: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
e460: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
e470: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
e480: 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65  Master;.  sqlite
e490: 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
e4a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
e4b0: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
e4c0: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
e4d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e4e0: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
e4f0: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
e500: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
e510: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
e520: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
e530: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e540: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
e550: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
e560: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
e570: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
e580: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
e590: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
e5a0: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
e5b0: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ence..  */.  pMa
e5c0: 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
e5d0: 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  file *)sqlite3_m
e5e0: 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73  alloc(pVfs->szOs
e5f0: 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
e600: 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
e610: 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
e620: 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
e630: 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
e640: 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
e650: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
e660: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
e670: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
e680: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
e690: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
e6a0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
e6b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e6c0: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
e6d0: 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
e6e0: 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
e6f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e700: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
e710: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
e720: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72  r_open = 1;..  r
e730: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
e740: 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
e750: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
e760: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e770: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
e780: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
e790: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
e7a0: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
e7b0: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
e7c0: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
e7d0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73   0;.    int nMas
e7e0: 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d  terPtr = pPager-
e7f0: 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
e800: 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  e+1;..    /* Loa
e810: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
e820: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e830: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
e840: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
e850: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
e860: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
e870: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
e880: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
e890: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
e8a0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
e8b0: 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  _malloc(nMasterJ
e8c0: 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
e8d0: 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  Ptr);.    if( !z
e8e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
e8f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
e900: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
e910: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
e920: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  ut;.    }.    zM
e930: 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
e940: 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
e950: 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20  erJournal];.    
e960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
e970: 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
e980: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
e990: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
e9a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e9b0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
e9c0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
e9d0: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
e9e0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
e9f0: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
ea00: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
ea10: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
ea20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
ea30: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
ea40: 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
ea50: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
ea60: 54 53 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  TS);.      if( r
ea70: 63 21 3d 30 20 26 26 20 72 63 21 3d 31 20 29 7b  c!=0 && rc!=1 ){
ea80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
ea90: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
eaa0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  ;.        goto d
eab0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
eac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
ead0: 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  rc==1 ){.       
eae0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
eaf0: 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
eb00: 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
eb10: 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
eb20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
eb30: 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
eb40: 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
eb50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
eb60: 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
eb70: 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
eb80: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
eb90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
eba0: 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
ebb0: 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
ebc0: 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73         int flags
ebd0: 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
ebe0: 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
ebf0: 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
ec00: 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  L);.        rc =
ec10: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
ec20: 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
ec30: 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
ec40: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
ec50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ec60: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ec70: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
ec80: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
ec90: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
eca0: 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
ecb0: 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
ecc0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
ecd0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ece0: 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
ecf0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ed00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ed10: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
ed20: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
ed30: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
ed40: 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
ed50: 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
ed60: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
ed70: 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
ed80: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
ed90: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
eda0: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
edb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
edc0: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
edd0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
ede0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
edf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ee00: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
ee10: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
ee20: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
ee30: 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
ee40: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
ee50: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
ee60: 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
ee70: 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
ee80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ee90: 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
eea0: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
eeb0: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
eec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
eed0: 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
eee0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
eef0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
ef00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74  urn rc;.}...stat
ef10: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72  ic void pager_tr
ef20: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67  uncate_cache(Pag
ef30: 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a  er *pPager);../*
ef40: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
ef50: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
ef60: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
ef70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
ef80: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
ef90: 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65  d. Also truncate
efa0: 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70 72   the cached repr
efb0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
efc0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69  e file..**.** Mi
efd0: 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
efe0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
eff0: 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
f000: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61 67  maller than nPag
f010: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 68  e..** This can h
f020: 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
f030: 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20 69 6e  le, if we are in
f040: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61   the middle of a
f050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
f060: 77 68 69 63 68 20 68 61 73 20 65 78 74 65 6e 64  which has extend
f070: 65 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ed the file size
f080: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61 67   and the new pag
f090: 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c  es are still all
f0a0: 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68   held.** in cach
f0b0: 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45 52  e, then an INSER
f0c0: 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65 73  T or UPDATE does
f0d0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c   a statement rol
f0e0: 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20  lback.  Some.** 
f0f0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
f100: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
f110: 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
f120: 64 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f 0a  d if you try to.
f130: 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  ** truncate a fi
f140: 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
f150: 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
f160: 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c 79  han it currently
f170: 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63   is,.** so detec
f180: 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
f190: 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72  do not do the tr
f1a0: 75 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  uncation..*/.sta
f1b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
f1c0: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
f1d0: 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29  ager, int nPage)
f1e0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f1f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
f200: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
f210: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
f220: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
f230: 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34 20  hods ){.    i64 
f240: 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
f250: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
f260: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
f270: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
f280: 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
f290: 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72  newSize = pPager
f2a0: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
f2b0: 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
f2c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f2d0: 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
f2e0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ize ){.      rc 
f2f0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
f300: 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
f310: 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  newSize);.    }.
f320: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
f330: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
f340: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
f350: 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
f360: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
f370: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
f380: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f390: 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f  ** Set the secto
f3a0: 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69  rSize for the gi
f3b0: 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  ven pager..**.**
f3c0: 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
f3d0: 20 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 20   is at least as 
f3e0: 62 69 67 20 61 73 20 74 68 65 20 73 65 63 74 6f  big as the secto
f3f0: 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a  r size reported.
f400: 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ** by sqlite3OsS
f410: 65 63 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68  ectorSize().  Th
f420: 65 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72  e minimum sector
f430: 20 73 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f   size is 512..*/
f440: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
f450: 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
f460: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
f470: 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
f480: 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
f490: 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
f4a0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
f4b0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  File ){.    /* S
f4c0: 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
f4d0: 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
f4e0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
f4f0: 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
f500: 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
f510: 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
f520: 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73 65  t, in whcih case
f530: 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
f540: 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
f550: 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20  will segfault.. 
f560: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
f570: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
f580: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
f590: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
f5a0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
f5b0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32  ->sectorSize<512
f5c0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
f5d0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
f5e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
f5f0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
f600: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
f610: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
f620: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
f630: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
f640: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
f650: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
f660: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
f670: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
f680: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
f690: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
f6a0: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
f6b0: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
f6c0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
f6d0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
f6e0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
f6f0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
f700: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
f710: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
f720: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
f730: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
f740: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
f750: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
f760: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
f770: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
f780: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f790: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
f7a0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
f7b0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
f7c0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
f7d0: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
f7e0: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
f7f0: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
f800: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
f810: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
f820: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
f830: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
f840: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
f850: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
f860: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
f870: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
f880: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
f890: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
f8a0: 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
f8b0: 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
f8c0: 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
f8d0: 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
f8e0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
f8f0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
f900: 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20  e page case..** 
f910: 20 28 37 29 20 20 34 20 62 79 74 65 20 69 6e 74   (7)  4 byte int
f920: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
f930: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
f940: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  s in the master 
f950: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
f960: 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75   name.  The valu
f970: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69  e may be zero (i
f980: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
f990: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a  re is no master.
f9a0: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
f9b0: 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79  .).**  (8)  N by
f9c0: 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  tes of the maste
f9d0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
f9e0: 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62   The name will b
f9f0: 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
fa00: 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69  .**       and mi
fa10: 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74  ght be shorter t
fa20: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
fa30: 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66  ad from (5).  If
fa40: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
fa50: 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20  **       of the 
fa60: 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65  name is \000 the
fa70: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  n there is no ma
fa80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ster journal.  T
fa90: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  he master.**    
faa0: 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20     journal name 
fab0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46  is stored in UTF
fac0: 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72  -8..**  (9)  Zer
fad0: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
fae0: 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
faf0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
fb00: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
fb10: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
fb20: 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
fb30: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
fb40: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
fb50: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
fb60: 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
fb70: 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
fb80: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fb90: 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
fba0: 72 73 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76  rst 8 items abov
fbb0: 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
fbc0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
fbd0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
fbe0: 66 20 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a  f the 9th item..
fbf0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
fc00: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
fc10: 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
fc20: 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
fc30: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
fc40: 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
fc50: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
fc60: 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
fc70: 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
fc80: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
fc90: 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
fca0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
fcb0: 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
fcc0: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
fcd0: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
fce0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
fcf0: 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
fd00: 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
fd10: 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
fd20: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
fd30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
fd40: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
fd50: 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
fd60: 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
fd70: 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
fd80: 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
fd90: 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
fda0: 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
fdb0: 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
fdc0: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
fdd0: 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
fde0: 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
fdf0: 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
fe00: 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
fe10: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
fe20: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
fe30: 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
fe40: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
fe50: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
fe60: 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
fe70: 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
fe80: 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
fe90: 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
fea0: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
feb0: 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
fec0: 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
fed0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
fee0: 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
fef0: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
ff00: 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
ff10: 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
ff20: 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
ff30: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
ff40: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
ff50: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
ff60: 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
ff70: 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
ff80: 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
ff90: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
ffa0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
ffb0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
ffc0: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
ffd0: 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
ffe0: 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
fff0: 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
10000 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
10010 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
10020 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
10030 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
10040 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
10050 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
10060 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
10070 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
10080 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
10090 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
100a0 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
100b0 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
100c0 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
100d0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
100e0 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
100f0 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
10100 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
10110 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
10120 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
10130 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
10140 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
10150 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
10160 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
10170 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
10180 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
10190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
101a0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
101b0 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
101c0 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
101e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
101f0 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
10200 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10230 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
10240 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
10250 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
10260 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
10270 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
10280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10290 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
102a0 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
102b0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
102c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
102d0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
102e0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
102f0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
10300 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
10310 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
10320 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10330 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
10340 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
10350 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
10360 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
10370 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
10380 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
10390 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
103a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
103b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
103c0 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
103d0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
103e0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
103f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10400 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20  TE_OK || szJ==0 
10410 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
10420 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
10430 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
10440 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10450 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10460 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
10470 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
10480 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10490 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
104a0 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
104b0 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
104c0 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
104d0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
104e0 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
104f0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
10500 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
10510 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  back..  */.  zMa
10520 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
10530 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
10540 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
10550 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
10560 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
10570 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
10580 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  e+1);.  if( rc!=
10590 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d  SQLITE_OK || (zM
105a0 61 73 74 65 72 5b 30 5d 20 0a 20 20 20 26 26 20  aster[0] .   && 
105b0 28 72 65 73 3d 73 71 6c 69 74 65 33 4f 73 41 63  (res=sqlite3OsAc
105c0 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
105d0 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
105e0 53 5f 45 58 49 53 54 53 29 29 3d 3d 30 20 29 20  S_EXISTS))==0 ) 
105f0 0a 20 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  .  ){.    zMaste
10600 72 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  r = 0;.    goto 
10610 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
10620 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
10630 0a 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a  .  if( res<0 ){.
10640 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10650 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
10660 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10670 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
10680 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
10690 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
106a0 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
106b0 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
106c0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
106d0 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
106e0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
106f0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
10700 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
10710 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
10720 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
10730 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
10740 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
10750 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
10760 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
10770 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
10780 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10790 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
107a0 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
107b0 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
107c0 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
107d0 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
107e0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
107f0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
10800 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
10810 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
10820 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
10830 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
10840 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
10850 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
10860 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
10870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10880 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
10890 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
108a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
108b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
108c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
108d0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
108e0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
108f0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
10900 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
10910 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
10920 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
10930 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
10940 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
10950 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
10960 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
10970 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
10980 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
10990 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
109a0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
109b0 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
109c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
109d0 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
109e0 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
109f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
10a00 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
10a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
10a20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10a30 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
10a40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
10a50 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
10a60 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10a70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
10a80 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
10a90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10aa0 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
10ab0 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
10ac0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
10ad0 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
10ae0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
10af0 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
10b00 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
10b10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
10b20 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
10b30 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
10b40 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
10b50 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
10b60 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
10b70 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
10b80 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
10b90 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
10ba0 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
10bb0 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
10bc0 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
10bd0 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
10be0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
10bf0 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
10c00 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
10c10 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
10c20 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  65..    */.    i
10c30 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
10c40 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
10c50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
10c60 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
10c70 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
10c80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
10c90 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
10ca0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
10cb0 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
10cc0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
10cd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10ce0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
10cf0 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
10d00 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10d10 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
10d20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
10d30 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
10d40 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
10d50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
10d60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10d70 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
10d80 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
10d90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
10da0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
10db0 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
10dc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10dd0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
10de0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
10df0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
10e00 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
10e10 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
10e20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
10e30 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
10e40 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
10e50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10e60 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
10e70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
10e80 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
10e90 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
10ea0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
10eb0 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
10ec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
10ee0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
10ef0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
10f00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10f10 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
10f20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
10f30 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
10f40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
10f50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
10f60 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
10f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10f80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
10f90 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
10fa0 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
10fb0 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
10fc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10fd0 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
10fe0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10ff0 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
11000 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
11010 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
11020 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
11030 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
11040 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
11050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11060 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
11070 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
11080 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
11090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
110a0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
110b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
110c0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
110d0 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
110e0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
110f0 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
11100 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
11110 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
11120 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11130 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
11140 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
11150 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
11160 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter);.  }..  /* 
11170 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
11180 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
11190 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
111a0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
111b0 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
111c0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
111d0 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
111e0 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
111f0 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
11200 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
11210 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
11220 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
11230 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
11240 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
11250 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11260 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
11270 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
11280 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
11290 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
112a0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
112b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
112c0 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
112d0 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
112e0 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
112f0 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
11300 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
11310 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
11320 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
11330 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
11340 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
11350 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
11360 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
11370 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
11380 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
11390 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
113a0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
113b0 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
113c0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
113d0 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
113e0 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
113f0 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
11400 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
11410 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
11420 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
11430 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
11440 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
11450 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
11460 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
11470 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11490 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
114a0 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
114b0 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
114c0 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
114d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
114e0 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
114f0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11500 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11510 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
11520 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
11530 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11540 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
11550 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
11560 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
11570 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
11580 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
11590 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28  os_szJ);.    if(
115a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
115b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
115c0 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f  assert( szJ==os_
115d0 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  szJ );.  }.#endi
115e0 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f  f..  /* Set hdrO
115f0 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66  ff to be the off
11600 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74  set just after t
11610 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61  he end of the la
11620 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  st journal.  ** 
11630 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66  page written bef
11640 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ore the first jo
11650 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72  urnal-header for
11660 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a   this statement.
11670 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
11680 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72   was written, or
11690 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
116a0 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
116b0 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
116c0 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
116d0 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
116e0 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
116f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11700 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
11710 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
11720 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
11730 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
11740 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
11750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
11760 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
11770 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
11780 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
11790 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
117a0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
117b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
117c0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
117d0 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ARED );..  /* Fi
117e0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
117f0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
11800 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
11810 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
11820 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11830 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67  tmtInUse && pPag
11840 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11850 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
11860 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
11870 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
11880 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
11890 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
118a0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
118b0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
118c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
118d0 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
118e0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d  ement journal om
118f0 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72  its checksums fr
11900 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63  om.  ** each rec
11910 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d  ord since power-
11920 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79  failure recovery
11930 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   is not importan
11940 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20  t to statement. 
11950 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20   ** journals..  
11960 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
11970 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
11980 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28  i64 offset = i*(
11990 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
119a0 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  ze);.    rc = pa
119b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
119c0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
119d0 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73  ager->stfd, offs
119e0 65 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  et, 0);.    asse
119f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
11a00 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
11a10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11a20 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
11a30 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
11a40 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70   Now roll some p
11a50 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  ages back from t
11a60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
11a70 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74  ournal. Pager.st
11a80 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73  mtJSize.  ** was
11a90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
11aa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
11ab0 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
11ac0 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73  t was started, s
11ad0 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e  o.  ** everythin
11ae0 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65  g after that nee
11af0 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
11b00 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74  back, either int
11b10 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
11b20 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20  ase, the memory 
11b30 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a  cache, or both..
11b40 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20    **.  ** If it 
11b50 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
11b60 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f  n Pager.stmtHdrO
11b70 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ff is the offset
11b80 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
11b90 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
11ba0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
11bb0 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68  ritten during th
11bc0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
11bd0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
11be0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11bf0 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
11c00 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
11c10 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
11c20 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
11c30 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
11c40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
11c50 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
11c60 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
11c70 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
11c80 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
11c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11ca0 66 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  ff, 1);.    asse
11cb0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
11cc0 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
11cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11ce0 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
11cf0 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
11d00 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
11d10 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
11d20 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20  .    u32 nJRec; 
11d30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11d40 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
11d50 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
11d60 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
11d70 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
11d80 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52  Pager, szJ, &nJR
11d90 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
11da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
11dc0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
11dd0 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
11de0 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
11df0 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ack;.    }.    i
11e00 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20  f( nJRec==0 ){. 
11e10 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a       nJRec = (sz
11e20 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
11e30 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
11e40 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
11e50 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
11e60 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26  nJRec-1; i>=0 &&
11e70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11e80 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b  Off < szJ; i--){
11e90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
11ea0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
11eb0 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
11ec0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11ed0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
11ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11ef0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
11f00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11f10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11f20 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
11f30 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
11f40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11f50 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
11f60 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
11f70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11f80 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
11f90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11fa0 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
11fb0 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
11fc0 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
11fd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11fe0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
11ff0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
12000 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
12010 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
12020 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
12030 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
12040 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
12050 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
12060 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
12070 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
12080 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
12090 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
120a0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
120b0 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
120c0 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
120d0 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
120e0 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
120f0 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
12100 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
12110 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
12120 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
12130 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
12140 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
12150 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
12160 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
12170 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
12180 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
12190 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
121a0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
121b0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
121c0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
121d0 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
121e0 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
121f0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
12200 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
12210 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
12220 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
12230 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
12240 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
12250 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
12260 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
12270 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
12280 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
12290 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
122a0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
122b0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
122c0 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
122d0 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
122e0 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
122f0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
12300 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
12310 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12320 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
12330 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
12340 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
12350 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
12360 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
12370 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
12380 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
12390 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
123a0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
123b0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
123c0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
123d0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
123e0 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
123f0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12400 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
12410 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
12420 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
12430 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
12440 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
12450 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
12460 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
12470 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
12480 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
12490 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
124a0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
124b0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
124c0 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
124d0 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
124e0 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
124f0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
12500 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
12510 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
12520 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
12530 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
12540 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
12550 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
12560 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
12570 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
12580 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12590 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
125a0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
125b0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
125c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
125d0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
125e0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
125f0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
12600 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
12610 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
12620 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
12630 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
12640 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
12650 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
12660 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
12670 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
12680 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
12690 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ile;.  pPager->s
126a0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c  ync_flags = (ful
126b0 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  l_fsync?SQLITE_S
126c0 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
126d0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
126e0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
126f0 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
12700 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
12710 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
12720 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
12730 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
12740 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
12750 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
12760 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
12770 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
12780 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
12790 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
127a0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
127b0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
127c0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
127d0 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
127e0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
127f0 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
12800 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
12810 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a  orary file. .**.
12820 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
12830 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
12840 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
12850 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
12860 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
12870 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
12880 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
12890 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
128a0 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
128b0 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
128c0 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
128d0 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
128e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
128f0 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69  Opentemp(.  sqli
12900 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
12910 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
12920 20 66 69 6c 65 20 73 79 73 74 65 6d 20 6c 61 79   file system lay
12930 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
12940 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
12950 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
12960 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
12970 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
12980 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
12990 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  me of the file. 
129a0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
129b0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
129c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
129d0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
129e0 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
129f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
12a00 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
12a10 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  !=0 );..#ifdef S
12a20 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
12a30 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
12a40 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
12a50 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
12a60 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
12a70 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
12a80 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
12a90 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
12aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
12ab0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
12ac0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
12ad0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
12ae0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
12af0 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
12b00 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
12b10 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c  Filename, pFile,
12b20 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
12b30 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
12b40 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d  ITE_OK || pFile-
12b50 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72  >pMethods );.  r
12b60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12b70 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
12b80 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
12b90 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
12ba0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
12bb0 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
12bc0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
12bd0 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
12be0 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
12bf0 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
12c00 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
12c10 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
12c20 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
12c30 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
12c40 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
12c50 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
12c60 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
12c70 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
12c80 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
12c90 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
12ca0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
12cb0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
12cc0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
12cd0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
12ce0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
12cf0 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
12d00 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
12d10 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
12d20 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
12d30 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
12d40 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
12d50 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
12d60 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
12d70 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
12d80 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
12d90 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
12da0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
12db0 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
12dc0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
12dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12de0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
12df0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
12e00 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
12e10 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
12e20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
12e30 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
12e40 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
12e50 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
12e60 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
12e70 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
12e80 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
12e90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12ea0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
12eb0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
12ec0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
12ed0 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
12ee0 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
12ef0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
12f00 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
12f10 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
12f20 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
12f30 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
12f40 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s             /*
12f50 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
12f60 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
12f70 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
12f80 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
12f90 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
12fa0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
12fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
12fc0 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
12fd0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
12fe0 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
12ff0 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
13000 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
13010 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
13020 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
13030 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
13040 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
13050 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
13060 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  0;.  int journal
13070 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  FileSize = sqlit
13080 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
13090 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61  fs);.  int nDefa
130a0 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45  ultPage = SQLITE
130b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
130c0 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74  ZE;.  char *zPat
130d0 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61  hname;.  int nPa
130e0 74 68 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a  thname;.  char *
130f0 7a 53 74 6d 74 4a 72 6e 6c 3b 0a 20 20 69 6e 74  zStmtJrnl;.  int
13100 20 6e 53 74 6d 74 4a 72 6e 6c 3b 0a 0a 20 20 2f   nStmtJrnl;..  /
13110 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 72 65  * The default re
13120 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70  turn is a NULL p
13130 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50  ointer */.  *ppP
13140 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
13150 43 6f 6d 70 75 74 65 20 74 68 65 20 66 75 6c 6c  Compute the full
13160 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e   pathname */.  n
13170 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
13180 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
13190 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
131a0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74  ite3_malloc(nPat
131b0 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 69 66 28 20  hname*2);.  if( 
131c0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
131d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
131e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
131f0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
13200 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
13210 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13220 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
13230 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
13240 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
13250 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
13260 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
13270 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
13280 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
13290 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  f.    {.      rc
132a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
132b0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
132c0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
132d0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
132e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
132f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13300 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  OsGetTempname(pV
13310 66 73 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  fs, nPathname, z
13320 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
13330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13340 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
13350 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
13360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
13370 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68 6e 61 6d  ;.  }.  nPathnam
13380 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68  e = strlen(zPath
13390 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 50 75 74  name);..  /* Put
133a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
133b0 6f 75 72 6e 61 6c 20 69 6e 20 74 65 6d 70 6f 72  ournal in tempor
133c0 61 72 79 20 64 69 73 6b 20 73 70 61 63 65 20 73  ary disk space s
133d0 69 6e 63 65 20 74 68 69 73 20 69 73 0a 20 20 2a  ince this is.  *
133e0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 52 41 4d 20  * sometimes RAM 
133f0 64 69 73 6b 20 6f 72 20 6f 74 68 65 72 20 6f 70  disk or other op
13400 74 69 6d 69 7a 65 64 20 73 74 6f 72 61 67 65 2e  timized storage.
13410 20 20 55 6e 6c 69 6b 65 6c 79 20 74 68 65 20 6d    Unlikely the m
13420 61 69 6e 0a 20 20 2a 2a 20 6d 61 69 6e 20 6a 6f  ain.  ** main jo
13430 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
13440 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
13450 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  l does not need 
13460 74 6f 20 62 65 20 0a 20 20 2a 2a 20 63 6f 6c 6f  to be .  ** colo
13470 63 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  cated with the d
13480 61 74 61 62 61 73 65 20 6e 6f 72 20 64 6f 65 73  atabase nor does
13490 20 69 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70   it need to be p
134a0 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
134b0 20 20 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 7a    zStmtJrnl = &z
134c0 50 61 74 68 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Pathname[nPathna
134d0 6d 65 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  me+1];.  rc = sq
134e0 6c 69 74 65 33 4f 73 47 65 74 54 65 6d 70 6e 61  lite3OsGetTempna
134f0 6d 65 28 70 56 66 73 2c 20 70 56 66 73 2d 3e 6d  me(pVfs, pVfs->m
13500 78 50 61 74 68 6e 61 6d 65 2b 31 2c 20 7a 53 74  xPathname+1, zSt
13510 6d 74 4a 72 6e 6c 29 3b 0a 20 20 69 66 28 20 72  mtJrnl);.  if( r
13520 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13530 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13540 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
13550 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
13560 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 3d 20 73 74    nStmtJrnl = st
13570 72 6c 65 6e 28 7a 53 74 6d 74 4a 72 6e 6c 29 3b  rlen(zStmtJrnl);
13580 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
13590 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70  memory for the p
135a0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
135b0 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  /.  pPager = sql
135c0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
135d0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67      sizeof(*pPag
135e0 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  er) +           
135f0 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
13600 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  re */.    journa
13610 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20  lFileSize +     
13620 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
13630 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74  rnal file struct
13640 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73  ure */ .    pVfs
13650 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 33 20 2b  ->szOsFile * 3 +
13660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
13670 61 69 6e 20 64 62 20 61 6e 64 20 74 77 6f 20 6a  ain db and two j
13680 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
13690 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65  .    3*nPathname
136a0 20 2b 20 34 30 20 2b 20 20 20 20 20 20 20 20 20   + 40 +         
136b0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a   /* zFilename, z
136c0 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72  Directory, zJour
136d0 6e 61 6c 20 2a 2f 0a 20 20 20 20 6e 53 74 6d 74  nal */.    nStmt
136e0 4a 72 6e 6c 20 20 20 20 20 20 20 20 20 20 20 20  Jrnl            
136f0 20 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 4a         /* zStmtJ
13700 72 6e 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  rnl */.  );.  if
13710 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20  ( !pPager ){.   
13720 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
13730 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
13740 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13750 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d 20  M;.  }.  pPtr = 
13760 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d  (u8 *)&pPager[1]
13770 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
13780 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
13790 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
137a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
137b0 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
137c0 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72  ile*0];.  pPager
137d0 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65  ->stfd = (sqlite
137e0 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
137f0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b  fs->szOsFile*1];
13800 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
13810 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
13820 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
13830 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65  File*2];.  pPage
13840 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
13850 63 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73  char*)&pPtr[pVfs
13860 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75  ->szOsFile*2+jou
13870 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20  rnalFileSize];. 
13880 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
13890 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
138a0 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
138b0 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  me+1];.  pPager-
138c0 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
138d0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
138e0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
138f0 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e  pPager->zStmtJrn
13900 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
13910 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
13920 31 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  10];.  pPager->p
13930 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 6d 65  Vfs = pVfs;.  me
13940 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
13950 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
13960 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b  e, nPathname+1);
13970 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
13980 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 20 7a 53 74  ->zStmtJrnl, zSt
13990 6d 74 4a 72 6e 6c 2c 20 6e 53 74 6d 74 4a 72 6e  mtJrnl, nStmtJrn
139a0 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  l+1);.  sqlite3_
139b0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
139c0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
139d0 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
139e0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
139f0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
13a00 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20   && !memDb ){.  
13a10 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e    if( nPathname>
13a20 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  (pVfs->mxPathnam
13a30 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75  e - sizeof("-jou
13a40 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20  rnal")) ){.     
13a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
13a60 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65  TOPEN;.    }else
13a70 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74  {.      int fout
13a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
13a90 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
13aa0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
13ab0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
13ac0 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
13ae0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26  ger->vfsFlags, &
13af0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61  fout);.      rea
13b00 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
13b10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
13b20 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  LY);..      /* I
13b30 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
13b40 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
13b50 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
13b60 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20  e access,.      
13b70 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
13b80 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
13b90 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
13ba0 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
13bb0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
13bc0 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
13bd0 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
13be0 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
13bf0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
13c00 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
13c10 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
13c20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
13c30 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
13c40 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
13c50 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a  rSize().      **
13c60 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
13c70 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
13c80 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
13c90 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
13ca0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
13cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13cc0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
13cd0 20 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72       int iSector
13ce0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
13cf0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
13d00 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
13d10 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65  if( nDefaultPage
13d20 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  <iSectorSize ){.
13d30 20 20 20 20 20 20 20 20 20 20 6e 44 65 66 61 75            nDefau
13d40 6c 74 50 61 67 65 20 3d 20 69 53 65 63 74 6f 72  ltPage = iSector
13d50 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
13d60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
13d70 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
13d80 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  E.        {.    
13d90 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
13da0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
13db0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
13dc0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
13dd0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
13de0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
13df0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
13e00 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
13e10 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
13e20 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
13e30 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
13e40 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
13e50 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
13e60 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
13e70 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
13e80 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
13e90 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 20 69 69  nDefaultPage; ii
13ea0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
13eb0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
13ec0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
13ed0 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
13ee0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
13ef0 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e 44  IC|(ii>>8)) ) nD
13f00 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69 69 3b  efaultPage = ii;
13f10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13f20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13f30 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61 75        if( nDefau
13f40 6c 74 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41  ltPage>SQLITE_MA
13f50 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
13f60 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
13f70 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
13f80 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
13f90 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
13fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13fb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
13fc0 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
13fd0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
13fe0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
13ff0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
14000 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
14010 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
14020 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
14030 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
14040 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
14050 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
14060 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
14070 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
14080 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
14090 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  e()..    */ .   
140a0 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
140b0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
140c0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
140d0 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  VE;.  }..  if( p
140e0 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Pager && rc==SQL
140f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
14100 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
14110 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
14120 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66 61 75 6c  3_malloc(nDefaul
14130 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tPage);.  }..  /
14140 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
14150 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  cured in either 
14160 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
14170 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74  ove..  ** Free t
14180 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
14190 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
141a0 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63   file..  ** Sinc
141b0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
141c0 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
141d0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
141e0 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
141f0 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
14200 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
14210 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 70  f( !pPager || !p
14220 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
14230 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
14240 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
14250 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
14260 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
14270 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53    return ((rc==S
14280 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45  QLITE_OK)?SQLITE
14290 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a  _NOMEM:rc);.  }.
142a0 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
142b0 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
142c0 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
142d0 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
142e0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49  >zFilename);.  I
142f0 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
14300 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
14310 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14320 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e))..  /* Fill i
14330 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f  n Pager.zDirecto
14340 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  ry[] */.  memcpy
14350 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
14360 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ory, pPager->zFi
14370 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
14380 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74  e+1);.  for(i=st
14390 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69  rlen(pPager->zDi
143a0 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26 26  rectory); i>0 &&
143b0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
143c0 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
143d0 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
143e0 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
143f0 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a  tory[i-1] = 0;..
14400 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67    /* Fill in Pag
14410 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f  er.zJournal[] */
14420 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
14430 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
14440 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  er->zFilename, n
14450 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d  Pathname);.  mem
14460 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
14470 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
14480 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29  , "-journal", 9)
14490 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  ;..  /* pPager->
144a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
144b0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
144c0 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
144d0 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
144e0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
144f0 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
14500 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
14510 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
14520 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
14530 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
14540 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
14550 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
14560 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14570 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
14580 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
14590 65 53 69 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74  eSize = nDefault
145a0 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Page;.  /* pPage
145b0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
145c0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
145d0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
145e0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
145f0 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
14600 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
14610 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   100;.  pPager->
14620 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
14630 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
14640 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
14650 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
14660 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  K; */.  assert( 
14670 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d  pPager->state ==
14680 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47   (tempFile ? PAG
14690 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50  ER_EXCLUSIVE : P
146a0 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a  AGER_UNLOCK) );.
146b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
146c0 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
146d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
146e0 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  = tempFile;.  as
146f0 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
14700 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
14710 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
14720 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
14730 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
14740 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
14750 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
14760 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
14770 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
14780 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14790 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20  ode = tempFile; 
147a0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
147b0 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67   = memDb;.  pPag
147c0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72  er->readOnly = r
147d0 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
147e0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
147f0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14800 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
14810 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
14820 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
14830 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
14840 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f  (pPager->noSync?
14850 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  0:1);.  pPager->
14860 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
14870 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
14880 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
14890 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
148a0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
148b0 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
148c0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
148d0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
148e0 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52  er->nExtra = FOR
148f0 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78  CE_ALIGNMENT(nEx
14900 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 70  tra);.  assert(p
14910 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
14920 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70  ods||memDb||temp
14930 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 6d 65  File);.  if( !me
14940 6d 44 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65  mDb ){.    setSe
14950 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
14960 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
14970 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
14980 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d  = 0; */.  /* mem
14990 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
149a0 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
149b0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
149c0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
149d0 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c  ager;.#ifdef SQL
149e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
149f0 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70  Y_MANAGEMENT.  p
14a00 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20  Pager->iInUseMM 
14a10 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69  = 0;.  pPager->i
14a20 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 69  InUseDB = 0;.  i
14a30 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
14a40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
14a50 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
14a60 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
14a70 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14a80 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  MEM2);.    sqlit
14a90 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
14aa0 75 74 65 78 29 3b 0a 20 20 20 20 70 50 61 67 65  utex);.    pPage
14ab0 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  r->pNext = sqlit
14ac0 65 33 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20  e3PagerList;.   
14ad0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
14ae0 72 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  rList ){.      a
14af0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
14b00 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d  gerList->pPrev==
14b10 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
14b20 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72  e3PagerList->pPr
14b30 65 76 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  ev = pPager;.   
14b40 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
14b50 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 73 71  Prev = 0;.    sq
14b60 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d  lite3PagerList =
14b70 20 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c   pPager;.    sql
14b80 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
14b90 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e  (mutex);.  }.#en
14ba0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
14bb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14bc0 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
14bd0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
14be0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
14bf0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
14c00 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
14c10 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
14c20 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
14c30 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
14c40 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
14c50 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
14c60 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
14c70 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
14c80 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
14c90 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
14ca0 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
14cb0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
14cc0 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
14cd0 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
14ce0 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
14cf0 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
14d00 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
14d10 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
14d20 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
14d30 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
14d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
14d50 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
14d60 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
14d70 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
14d80 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
14d90 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
14da0 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
14db0 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
14dc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
14dd0 67 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72  gerSetDestructor
14de0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
14df0 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62  void (*xDesc)(Db
14e00 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
14e10 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
14e20 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
14e30 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
14e40 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
14e50 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
14e60 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
14e70 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
14e80 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
14e90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
14ea0 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
14eb0 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
14ec0 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
14ed0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
14ee0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
14ef0 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
14f00 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
14f10 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
14f20 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
14f30 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
14f40 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
14f50 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
14f60 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
14f70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
14f80 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  tReiniter(Pager 
14f90 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
14fa0 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
14fb0 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
14fc0 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
14fd0 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
14fe0 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  Set the page siz
14ff0 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  e to *pPageSize.
15000 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20   If the suggest 
15010 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 69 73  new page size is
15020 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74  .** inappropriat
15030 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72  e, then an alter
15040 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65  native page size
15050 20 69 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a   is set to that.
15060 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ** value before 
15070 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
15080 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
15090 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
150a0 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50  *pPager, u16 *pP
150b0 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20  ageSize){.  int 
150c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
150d0 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
150e0 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61   *pPageSize;.  a
150f0 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
15100 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
15110 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
15120 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
15130 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28  E_SIZE) );.  if(
15140 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
15150 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70  eSize!=pPager->p
15160 61 67 65 53 69 7a 65 20 0a 20 20 20 26 26 20 21  ageSize .   && !
15170 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
15180 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
15190 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
151a0 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29  *pNew = (char *)
151b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
151c0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
151d0 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !pNew ){.     
151e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
151f0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
15200 20 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28       pagerEnter(
15210 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
15220 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
15230 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
15240 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
15250 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 65 74  eSize;.      set
15260 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
15270 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
15280 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70  3_free(pPager->p
15290 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
152a0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
152b0 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
152c0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
152d0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
152e0 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50   *pPageSize = pP
152f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
15300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15310 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
15320 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
15330 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
15340 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
15350 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
15360 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
15370 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
15380 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
15390 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
153a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
153b0 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
153c0 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
153d0 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
153e0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
153f0 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
15400 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
15410 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
15420 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
15430 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
15440 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
15450 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
15460 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
15470 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
15480 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
15490 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
154a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
154b0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
154c0 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
154d0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
154e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
154f0 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
15500 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
15510 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
15520 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
15530 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
15540 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
15550 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
15560 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
15570 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
15580 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
15590 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
155a0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
155b0 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
155c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
155d0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
155e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
155f0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
15600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15610 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
15620 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
15630 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
15640 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
15650 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
15660 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
15670 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15680 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
15690 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
156a0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
156b0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
156c0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
156d0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
156e0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
156f0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
15700 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
15710 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
15720 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
15730 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
15740 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
15750 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
15760 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
15770 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
15780 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
15790 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
157a0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
157b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
157c0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
157d0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
157e0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
157f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15800 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
15810 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
15820 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
15830 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
15840 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
15850 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
15860 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
15870 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
15880 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
15890 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
158a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
158b0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
158c0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
158d0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
158e0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
158f0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
15900 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
15910 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
15920 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
15930 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
15940 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
15950 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
15960 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
15970 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
15980 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
15990 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
159a0 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
159b0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
159c0 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
159d0 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
159e0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
159f0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
15a00 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
15a10 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
15a20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
15a30 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
15a40 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
15a50 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
15a60 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
15a70 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
15a80 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
15a90 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
15aa0 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
15ab0 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
15ac0 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
15ad0 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
15ae0 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
15af0 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
15b00 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
15b10 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  his)..*/.int sql
15b20 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
15b30 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
15b40 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
15b50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
15b60 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
15b70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
15b80 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
15b90 3b 0a 20 20 61 73 73 65 72 74 28 4d 45 4d 44 42  ;.  assert(MEMDB
15ba0 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ||pPager->fd->pM
15bb0 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
15bc0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
15bd0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
15be0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54  thods ){.    IOT
15bf0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
15c00 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
15c10 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
15c20 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
15c30 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
15c40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15c50 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
15c60 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
15c70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
15c80 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
15c90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15ca0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
15cb0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
15cc0 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
15cd0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
15ce0 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20  with.** pPager. 
15cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45  .**.** If the PE
15d00 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20  NDING_BYTE lies 
15d10 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65  on the page dire
15d20 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65  ctly after the e
15d30 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  nd of the.** fil
15d40 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72  e, then consider
15d50 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20   this page part 
15d60 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e  of the file too.
15d70 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
15d80 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  .** PENDING_BYTE
15d90 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74   is byte 4096 (t
15da0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
15db0 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65   page 5) and the
15dc0 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
15dd0 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74  file is 4096 byt
15de0 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65  es, 5 is returne
15df0 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a  d instead of 4..
15e00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
15e10 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
15e20 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
15e30 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 n = 0;.  int 
15e40 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
15e50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
15e60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
15e70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
15e80 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  1;.  }.  if( pPa
15e90 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
15ea0 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
15eb0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
15ec0 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  se {.    assert(
15ed0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
15ee0 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
15ef0 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  mpFile);.    if(
15f00 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   (pPager->fd->pM
15f10 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20  ethods).     && 
15f20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
15f30 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
15f40 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45  fd, &n))!=SQLITE
15f50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
15f60 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
15f70 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
15f80 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
15f90 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
15fa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
15fb0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
15fc0 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
15fd0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
15fe0 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
15ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
16000 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16010 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
16020 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
16030 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
16040 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
16050 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
16060 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
16070 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
16080 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
16090 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
160a0 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50  f( n>pPager->mxP
160b0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
160c0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20  r->mxPgno = n;. 
160d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
160e0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
160f0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
16100 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
16110 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
16120 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
16130 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
16140 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
16150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
16160 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
16170 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
16180 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
16190 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
161a0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
161b0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
161c0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29   clearHistory(x)
161d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
161e0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
161f0 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
16200 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
16210 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  er*);../*.** Unl
16220 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 73  ink pPg from its
16230 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
16240 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e  o set the page n
16250 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e  umber to 0 to in
16260 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74  dicate.** that t
16270 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70  he page is not p
16280 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20  art of any hash 
16290 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72  chain. This is r
162a0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
162b0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
162c0 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f  gerMovepage() ro
162d0 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20  utine can leave 
162e0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  a page in the .*
162f0 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65  * pNextFree/pPre
16300 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20  vFree list that 
16310 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66  is not a part of
16320 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e   any hash-chain.
16330 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16340 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
16350 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16360 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
16370 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
16380 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
16390 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
163a0 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
163b0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  h==0 );.    retu
163c0 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rn;.  }.  if( pP
163d0 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
163e0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
163f0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
16400 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
16410 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
16420 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
16430 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16440 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20  aHash[pPg->pgno 
16450 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
16460 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20  -1)]!=pPg );.   
16470 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d   pPg->pPrevHash-
16480 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
16490 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
164a0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20  else{.    int h 
164b0 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  = pPg->pgno & (p
164c0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
164d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
164e0 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65  sh[h] = pPg->pNe
164f0 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  xtHash;.  }.  if
16500 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63  ( MEMDB ){.    c
16510 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
16520 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
16530 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70  Pager));.  }.  p
16540 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
16550 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
16560 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
16570 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  = 0;.}../*.** Un
16580 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d  link a page from
16590 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28   the free list (
165a0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
165b0 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
165c0 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d  ==0).** and from
165d0 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73   its hash collis
165e0 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ion chain..*/.st
165f0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
16600 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
16610 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
16620 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
16630 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
16640 6f 6d 20 66 72 65 65 20 70 61 67 65 20 6c 69 73  om free page lis
16650 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52 65  t */.  lruListRe
16660 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  move(pPg);..  /*
16670 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
16680 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65   pgno hash table
16690 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
166a0 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
166b0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  g);.}../*.** Thi
166c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
166d0 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  d to truncate th
166e0 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20 64  e cache when a d
166f0 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72  atabase.** is tr
16700 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66  uncated.  Drop f
16710 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c  rom the cache al
16720 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  l pages whose pg
16730 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20  no is.** larger 
16740 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
16750 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66  ize and is unref
16760 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  erenced..**.** R
16770 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
16780 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
16790 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
167a0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74  eroed..**.** Act
167b0 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f  ually, at the po
167c0 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  int this routine
167d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77   is called, it w
167e0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72  ould be.** an er
167f0 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72 65  ror to have a re
16800 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20  ferenced page.  
16810 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e 20  But rather than 
16820 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70  delete.** that p
16830 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65  age and guarante
16840 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 73  e a subsequent s
16850 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d  egfault, it seem
16860 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a  s better.** to z
16870 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20  ero it and hope 
16880 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75  that we error ou
16890 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61  t sanely..*/.sta
168a0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
168b0 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
168c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
168d0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
168e0 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
168f0 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
16900 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
16910 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
16920 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
16930 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
16940 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
16950 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
16960 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
16970 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
16980 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
16990 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
169a0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
169b0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
169c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
169d0 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
169e0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
169f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
16a00 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
16a10 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ll;.      IOTRAC
16a20 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
16a30 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
16a40 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
16a50 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
16a60 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
16a70 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e  count);.      un
16a80 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
16a90 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
16aa0 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Pg);.      sqlit
16ab0 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61  e3_free(pPg->pDa
16ac0 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
16ad0 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20  e3_free(pPg);.  
16ae0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
16af0 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
16b00 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
16b10 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
16b20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
16b30 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
16b40 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
16b50 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
16b60 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
16b70 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
16b80 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
16b90 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
16ba0 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
16bb0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
16bc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
16bd0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
16be0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
16bf0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
16c00 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
16c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
16c20 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
16c30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
16c40 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
16c50 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
16c60 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
16c70 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
16c80 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
16c90 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
16ca0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
16cb0 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
16cc0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
16cd0 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
16ce0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
16cf0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
16d00 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
16d10 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
16d20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
16d30 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
16d40 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
16d50 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
16d60 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
16d70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
16d80 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
16d90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
16da0 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69  || MEMDB );..  i
16db0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
16dc0 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
16dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
16de0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16df0 66 28 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  f( pPager->pBusy
16e00 48 61 6e 64 6c 65 72 20 29 20 70 50 61 67 65 72  Handler ) pPager
16e10 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
16e20 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 64  nBusy = 0;.    d
16e30 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
16e40 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
16e50 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
16e60 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
16e70 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
16e80 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  && sqlite3Invoke
16e90 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
16ea0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
16eb0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
16ec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16ed0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
16ee0 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
16ef0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
16f00 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
16f10 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
16f20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16f40 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
16f50 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
16f60 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
16f70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16f80 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
16f90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16fa0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
16fb0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
16fc0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
16fd0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d  AGER_SHARED || M
16fe0 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65  EMDB );.  sqlite
16ff0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17000 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
17010 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
17020 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
17030 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
17040 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
17050 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
17060 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
17070 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
17080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17090 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
170a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
170b0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
170c0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
170d0 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
170e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
170f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  _OK;.  }.  pager
17100 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
17110 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
17120 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  l(pPager);.  pag
17130 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
17140 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17160 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
17170 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   Get an exclusiv
17180 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
17190 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72  tabase before tr
171a0 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 70  uncating. */.  p
171b0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
171c0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
171d0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
171e0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
171f0 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  OCK);.  pagerLea
17200 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
17210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17230 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61  ;.  }..  rc = pa
17240 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
17250 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72  ger, nPage);.  r
17260 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17270 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
17280 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
17290 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
172a0 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
172b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
172c0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
172d0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
172e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
172f0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
17300 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
17310 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
17320 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
17330 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
17340 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
17350 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
17360 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
17370 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
17380 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
17390 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
173a0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
173b0 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
173c0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
173d0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
173e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
173f0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
17400 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
17410 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
17420 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
17430 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
17440 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
17450 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
17460 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
17470 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
17480 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
17490 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
174a0 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
174b0 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
174c0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
174d0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
174e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
174f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17500 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
17510 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d 45  GEMENT.  if( !ME
17520 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MDB ){.    sqlit
17530 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20  e3_mutex *mutex 
17540 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
17550 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
17560 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
17570 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
17580 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
17590 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
175a0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
175b0 70 50 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e 70  pPager->pPrev->p
175c0 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Next = pPager->p
175d0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
175e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
175f0 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72  gerList = pPager
17600 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
17610 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
17620 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  Next ){.      pP
17630 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  ager->pNext->pPr
17640 65 76 20 3d 20 70 50 61 67 65 72 2d 3e 70 50 72  ev = pPager->pPr
17650 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ev;.    }.    sq
17660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
17670 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65  e(mutex);.  }.#e
17680 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f  ndif..  disable_
17690 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
176a0 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d  ors();.  pPager-
176b0 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
176c0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
176d0 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67  eMode = 0;.  pag
176e0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
176f0 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  ;.  pagerUnlockA
17700 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
17710 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  r);.  enable_sim
17720 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17730 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
17740 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  2("CLOSE %d\n", 
17750 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
17760 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
17770 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
17780 72 29 29 0a 20 20 61 73 73 65 72 74 28 20 70 50  r)).  assert( pP
17790 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
177a0 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
177b0 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67  lOpen==0 && pPag
177c0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29  er->stmtOpen==0)
177d0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
177e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
177f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
17800 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
17810 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
17820 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
17830 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
17840 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
17850 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
17860 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
17870 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
17880 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
17890 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
178a0 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
178b0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
178c0 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
178d0 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
178e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
178f0 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
17900 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
17910 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
17920 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74   }.  */..  sqlit
17930 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
17940 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65  aHash);.  sqlite
17950 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70  3_free(pPager->p
17960 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
17970 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
17980 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17990 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
179a0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
179b0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
179c0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
179d0 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
179e0 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
179f0 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
17a00 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
17a10 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
17a20 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ge *p){.  return
17a30 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64   p->pgno;.}.#end
17a40 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  if../*.** The pa
17a50 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
17a60 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
17a70 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
17a80 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
17a90 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
17aa0 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
17ab0 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
17ac0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
17ad0 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
17ae0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
17af0 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
17b00 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
17b10 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
17b20 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
17b30 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
17b40 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
17b50 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
17b60 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
17b70 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
17b80 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
17b90 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
17ba0 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
17bb0 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
17bc0 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
17bd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
17be0 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
17bf0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
17c00 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
17c10 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
17c20 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
17c30 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
17c40 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c 72 75  e it. */.    lru
17c50 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b  ListRemove(pPg);
17c60 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
17c70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
17c80 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 23  pPg->nRef++;.}.#
17c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
17ca0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
17cb0 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
17cc0 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
17cd0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
17ce0 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
17cf0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
17d00 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
17d10 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  +;.    }.  }.#el
17d20 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
17d30 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
17d40 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
17d50 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
17d60 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
17d70 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
17d80 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
17d90 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
17da0 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
17db0 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
17dc0 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
17dd0 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
17de0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
17df0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61  Page *pPg){.  pa
17e00 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50  gerEnter(pPg->pP
17e10 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65  ager);.  page_re
17e20 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c  f(pPg);.  pagerL
17e30 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72  eave(pPg->pPager
17e40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17e50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17e60 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
17e70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
17e80 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
17e90 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
17ea0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
17eb0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
17ec0 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
17ed0 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
17ee0 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
17ef0 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
17f00 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
17f10 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
17f20 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
17f30 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
17f40 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
17f50 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
17f60 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
17f70 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
17f80 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
17f90 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
17fa0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
17fb0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
17fc0 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
17fd0 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
17fe0 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
17ff0 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
18000 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
18010 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
18020 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
18030 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
18040 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
18050 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18060 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
18070 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
18080 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
18090 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
180a0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
180b0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
180c0 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
180d0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
180e0 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
180f0 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
18100 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
18110 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
18120 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
18130 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
18140 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
18150 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
18160 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
18170 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
18180 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
18190 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
181a0 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
181b0 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
181c0 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
181d0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
181e0 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75   so no sync occu
181f0 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
18200 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
18210 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  L flag is set fo
18220 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  r the persistent
18230 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a   media on which.
18240 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18250 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20  is stored, then 
18260 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
18270 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  r called on the 
18280 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
18290 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
182a0 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
182b0 65 64 20 69 73 20 74 6f 20 75 70 64 61 74 65 20  ed is to update 
182c0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
182d0 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
182e0 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   header..**.** T
182f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
18300 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
18310 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
18320 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
18330 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
18340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
18350 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
18360 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
18370 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
18380 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
18390 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
183a0 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
183b0 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
183c0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
183d0 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
183e0 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
183f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
18400 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
18410 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
18420 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
18430 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
18440 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
18450 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
18460 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
18470 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
18480 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18490 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
184a0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 61 73 73  );..      /* ass
184b0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
184c0 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
184d0 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
184e0 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
184f0 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
18500 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
18510 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
18520 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
18530 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
18540 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
18550 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
18560 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
18570 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
18580 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
18590 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
185a0 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
185b0 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
185c0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
185d0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
185e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
185f0 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  jSz;.        rc 
18600 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
18610 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
18620 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
18630 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
18640 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
18650 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
18660 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
18670 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
18680 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
18690 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
186a0 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
186b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
186c0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
186d0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
186e0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
186f0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
18700 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
18710 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
18720 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
18730 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
18740 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
18750 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
18760 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
18770 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
18780 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
18790 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
187a0 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
187b0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
187c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
187d0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
187e0 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
187f0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
18800 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
18810 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
18820 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
18830 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
18840 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
18850 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
18860 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
18870 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
18880 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
18890 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
188a0 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
188b0 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
188c0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
188d0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
188e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
188f0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
18900 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
18910 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
18920 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20  64 jrnlOff;.    
18930 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18940 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
18950 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
18960 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
18970 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
18980 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
18990 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
189a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
189b0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
189c0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
189d0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
189e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
189f0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
18a00 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
18a10 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
18a20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
18a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18a40 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e    }..        jrn
18a50 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
18a60 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
18a70 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
18a80 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
18a90 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
18aa0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
18ab0 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20   jrnlOff, 4));. 
18ac0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
18ad0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
18ae0 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50  jfd, jrnlOff, pP
18af0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
18b00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
18b10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
18b20 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
18b30 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
18b40 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
18b50 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
18b60 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
18b70 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
18b80 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18b90 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
18ba0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
18bb0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
18bc0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
18bd0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
18be0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
18bf0 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
18c00 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
18c10 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
18c20 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
18c30 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
18c40 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
18c50 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
18c60 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
18c70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18c80 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
18c90 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
18ca0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
18cb0 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
18cc0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
18cd0 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
18ce0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
18cf0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
18d00 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
18d10 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
18d20 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
18d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c  ;.    }.    lruL
18d40 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
18d50 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
18d60 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
18d70 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
18d80 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
18d90 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
18da0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
18db0 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
18dc0 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
18dd0 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
18de0 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
18df0 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
18e00 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
18e10 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
18e20 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
18e30 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
18e40 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
18e50 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
18e60 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
18e70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18e80 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
18e90 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ed==pPager->lru.
18ea0 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
18eb0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
18ec0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
18ed0 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
18ee0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
18ef0 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
18f00 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
18f10 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
18f20 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
18f30 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
18f40 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
18f50 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
18f60 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
18f70 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
18f80 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
18f90 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
18fa0 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
18fb0 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
18fc0 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
18fd0 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
18fe0 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
18ff0 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
19000 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
19010 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19020 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
19030 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
19040 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
19050 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
19060 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
19070 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
19080 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
19090 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
190a0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
190b0 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
190c0 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
190d0 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
190e0 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
190f0 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
19100 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
19110 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
19120 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
19130 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
19140 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
19150 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
19160 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
19170 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
19180 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
19190 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
191a0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
191b0 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
191c0 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
191d0 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
191e0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
191f0 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
19200 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
19210 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
19220 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
19230 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
19240 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
19250 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
19260 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
19270 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
19280 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
19290 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
192a0 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
192b0 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
192c0 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
192d0 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
192e0 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
192f0 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
19300 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
19310 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
19320 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
19330 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
19340 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
19350 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
19360 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
19370 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
19380 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
19390 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
193a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
193b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
193c0 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
193d0 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
193e0 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
193f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19400 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
19410 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
19420 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
19430 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
19440 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
19450 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
19460 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
19470 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
19480 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
19490 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
194a0 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
194b0 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
194c0 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
194d0 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
194e0 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
194f0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
19500 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
19510 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
19520 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
19530 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
19540 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
19550 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
19560 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
19570 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
19580 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
19590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
195a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
195b0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
195c0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
195d0 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
195e0 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
195f0 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
19600 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
19610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19620 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
19630 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
19640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19650 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
19660 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
19670 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
19680 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  er;.  PgHdr *p;.
19690 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
196a0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
196b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
196c0 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
196d0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
196e0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
196f0 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
19700 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
19710 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
19720 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
19730 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
19740 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
19750 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
19760 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
19770 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
19780 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
19790 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
197a0 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
197b0 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
197c0 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
197d0 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
197e0 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
197f0 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
19800 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
19810 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
19820 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
19830 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
19840 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
19850 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
19860 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
19870 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
19880 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
19890 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
198a0 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
198b0 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
198c0 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
198d0 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
198e0 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
198f0 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
19900 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
19910 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
19920 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
19930 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
19940 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
19950 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
19960 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
19970 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
19980 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
19990 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
199a0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
199b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
199c0 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
199d0 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
199e0 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
199f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
19a00 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
19a10 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
19a20 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
19a30 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
19a40 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
19a50 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
19a60 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
19a70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
19a80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19a90 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
19aa0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
19ab0 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
19ac0 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28  t(pList);.  for(
19ad0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
19ae0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
19af0 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79 20 29  sert( p->dirty )
19b00 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d  ;.    p->dirty =
19b10 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
19b20 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f   pList ){..    /
19b30 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
19b40 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
19b50 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
19b60 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  ow. */.    if( !
19b70 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
19b80 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73  hods ){.      as
19b90 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d  sert(pPager->tem
19ba0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63  pFile);.      rc
19bb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
19bc0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e  pentemp(pPager->
19bd0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 66 64  pVfs, pPager->fd
19be0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
19bf0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
19c20 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
19c30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19c40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19c50 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
19c60 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
19c70 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
19c80 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
19c90 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
19ca0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
19cb0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
19cc0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29  3PagerTruncate()
19cd0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
19ce0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
19cf0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
19d00 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
19d10 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
19d20 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
19d30 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
19d40 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
19d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
19d60 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
19d70 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
19d80 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
19d90 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
19da0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
19db0 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Size;.      char
19dc0 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
19dd0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
19de0 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
19df0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
19e00 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
19e10 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
19e20 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
19e30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19e40 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
19e50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
19e60 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
19e70 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
19e80 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
19e90 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
19ea0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
19eb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19ec0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
19ed0 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
19ee0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19ef0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
19f00 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
19f10 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
19f20 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
19f30 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
19f40 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
19f50 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
19f60 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
19f70 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
19f80 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
19f90 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
19fa0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
19fb0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
19fc0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
19fd0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
19fe0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
19ff0 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
1a000 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1a010 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
1a020 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
1a030 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
1a040 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66  eturn rc;.#ifdef
1a050 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1a060 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
1a070 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1a080 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
1a090 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
1a0a0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1a0b0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
1a0c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a0d0 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
1a0e0 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
1a0f0 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
1a100 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
1a110 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
1a120 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
1a130 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
1a140 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
1a150 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
1a160 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
1a170 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
1a180 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1a190 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
1a1a0 61 67 65 72 29 7b 0a 0a 23 69 66 6e 64 65 66 20  ager){..#ifndef 
1a1b0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  NDEBUG.  /* Veri
1a1c0 66 79 20 74 68 65 20 73 61 6e 69 74 79 20 6f 66  fy the sanity of
1a1d0 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20   the dirty list 
1a1e0 77 68 65 6e 20 77 65 20 61 72 65 20 72 75 6e 6e  when we are runn
1a1f0 69 6e 67 0a 20 20 2a 2a 20 69 6e 20 64 65 62 75  ing.  ** in debu
1a200 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 54 68 69  gging mode.  Thi
1a210 73 20 69 73 20 65 78 70 65 6e 73 69 76 65 2c 20  s is expensive, 
1a220 73 6f 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 64  so do not.  ** d
1a230 6f 20 74 68 69 73 20 6f 6e 20 61 20 6e 6f 72 6d  o this on a norm
1a240 61 6c 20 62 75 69 6c 64 2e 20 2a 2f 0a 20 20 69  al build. */.  i
1a250 6e 74 20 6e 31 20 3d 20 30 3b 0a 20 20 69 6e 74  nt n1 = 0;.  int
1a260 20 6e 32 20 3d 20 30 3b 0a 20 20 50 67 48 64 72   n2 = 0;.  PgHdr
1a270 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61   *p;.  for(p=pPa
1a280 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
1a290 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 20 69 66  p->pNextAll){ if
1a2a0 28 20 70 2d 3e 64 69 72 74 79 20 29 20 6e 31 2b  ( p->dirty ) n1+
1a2b0 2b 3b 20 7d 0a 20 20 66 6f 72 28 70 3d 70 50 61  +; }.  for(p=pPa
1a2c0 67 65 72 2d 3e 70 44 69 72 74 79 3b 20 70 3b 20  ger->pDirty; p; 
1a2d0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 20 6e 32  p=p->pDirty){ n2
1a2e0 2b 2b 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ++; }.  assert( 
1a2f0 6e 31 3d 3d 6e 32 20 29 3b 0a 23 65 6e 64 69 66  n1==n2 );.#endif
1a300 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ..  return pPage
1a310 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  r->pDirty;.}../*
1a320 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1a330 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
1a340 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
1a350 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
1a360 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
1a370 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
1a380 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
1a390 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
1a3a0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
1a3b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a3c0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
1a3d0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
1a3e0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
1a3f0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
1a400 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
1a410 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
1a420 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
1a430 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
1a440 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1a450 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  al..**.** Return
1a460 20 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61   negative if una
1a470 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
1a480 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74   the status of t
1a490 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  he journal..*/.s
1a4a0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
1a4b0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
1a4c0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1a4d0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1a4e0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
1a4f0 74 20 72 63 3b 0a 20 20 69 66 28 20 21 70 50 61  t rc;.  if( !pPa
1a500 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1a510 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1a520 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
1a530 4d 65 74 68 6f 64 73 20 29 20 72 65 74 75 72 6e  Methods ) return
1a540 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
1a550 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
1a560 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1a570 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1a580 5f 45 58 49 53 54 53 29 3b 0a 20 20 69 66 28 20  _EXISTS);.  if( 
1a590 72 63 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc<=0 ){.    ret
1a5a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1a5b0 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
1a5c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
1a5d0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1a5e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1a5f0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
1a600 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1a610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
1a620 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
1a630 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1a640 61 6c 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  al, 0);.    retu
1a650 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
1a660 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1a670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
1a680 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
1a690 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63  the cache that c
1a6a0 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20  an be recycled. 
1a6b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a6c0 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ine may return S
1a6d0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
1a6e0 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49  ITE_FULL or SQLI
1a6f0 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f  TE_OK. It .** do
1a700 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70  es not set the p
1a710 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76  Pager->errCode v
1a720 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1a730 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63  ic int pager_rec
1a740 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  ycle(Pager *pPag
1a750 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
1a760 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1a770 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
1a780 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
1a790 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  l to call this f
1a7a0 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74  unction unless t
1a7b0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 0a  he pager object.
1a7c0 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
1a7d0 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61 74  by pPager has at
1a7e0 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65 20   least one free 
1a7f0 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68 20  page (page with 
1a800 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a  nRef==0)..  */ .
1a810 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
1a820 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
1a830 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
1a840 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
1a850 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
1a860 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
1a870 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
1a880 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
1a890 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
1a8a0 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
1a8b0 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
1a8c0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a8d0 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
1a8e0 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
1a8f0 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
1a900 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1a910 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
1a920 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
1a930 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
1a940 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a950 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
1a960 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
1a970 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
1a980 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
1a990 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
1a9a0 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
1a9b0 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
1a9c0 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
1a9d0 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  & pPager->lru.pF
1a9e0 69 72 73 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  irst){.    int i
1a9f0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1aa00 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1aa10 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1aa20 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
1aa30 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1aa40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
1aa50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1aa60 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1aa70 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1aa80 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1aa90 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1aaa0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1aab0 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
1aac0 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
1aad0 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
1aae0 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
1aaf0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1ab00 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
1ab10 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
1ab20 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
1ab30 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
1ab40 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
1ab50 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
1ab60 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
1ab70 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
1ab80 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
1ab90 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
1aba0 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
1abb0 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
1abc0 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
1abd0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
1abe0 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
1abf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
1ac00 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1ac10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ac20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ac30 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
1ac40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1ac50 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
1ac60 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1ac70 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1ac80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ac90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1aca0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1acb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
1acc0 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
1acd0 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  rst;.  }..  asse
1ace0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
1acf0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1ad00 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
1ad10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
1ad20 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
1ad30 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
1ad40 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
1ad50 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1ad60 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
1ad70 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
1ad80 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
1ad90 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1ada0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
1adb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1adc0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
1add0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  Pg );.    pPg->d
1ade0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
1adf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ae00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ae10 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
1ae20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1ae30 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
1ae40 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
1ae50 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
1ae60 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
1ae70 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
1ae80 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
1ae90 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
1aea0 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
1aeb0 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
1aec0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1aed0 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
1aee0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
1aef0 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
1af00 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74  saction..  ** It
1af10 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1af20 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
1af30 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
1af40 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
1af50 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
1af60 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
1af70 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
1af80 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
1af90 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  t remember.  ** 
1afa0 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
1afb0 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
1afc0 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
1afd0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
1afe0 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  st.  ** be marke
1aff0 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
1b000 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
1b010 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   out..  */.  if(
1b020 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1b030 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52  back ){.    IOTR
1b040 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c  ACE(("ALWAYS_ROL
1b050 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  LBACK %p\n", pPa
1b060 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72  ger)).    pPager
1b070 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1b080 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
1b090 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
1b0a0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
1b0b0 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
1b0c0 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ash table.  */. 
1b0d0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
1b0e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1b0f0 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a  >pgno==0 );..  *
1b100 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
1b110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b120 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1b130 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1b140 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20  ANAGEMENT./*.** 
1b150 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1b160 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20   called to free 
1b170 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61  superfluous dyna
1b180 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
1b190 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64  d memory.** held
1b1a0 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79   by the pager sy
1b1b0 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20  stem. Memory in 
1b1c0 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74  use by any SQLit
1b1d0 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65  e pager allocate
1b1e0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72  d.** by the curr
1b1f0 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62  ent thread may b
1b200 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  e sqlite3_free()
1b210 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
1b220 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1b230 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
1b240 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
1b250 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
1b260 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
1b270 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
1b280 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20  rns. The return 
1b290 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
1b2a0 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
1b2b0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
1b2c0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e   released..*/.in
1b2d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
1b2e0 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20  leaseMemory(int 
1b2f0 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nReq){.  int nRe
1b300 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20  leased = 0;     
1b310 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1b320 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
1b330 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c   so far */.  sql
1b340 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1b350 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
1b360 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20  MEM2 mutex */.  
1b370 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1b380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b390 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1b3a0 70 61 67 65 72 73 20 2a 2f 0a 20 20 42 75 73 79  pagers */.  Busy
1b3b0 48 61 6e 64 6c 65 72 20 2a 73 61 76 65 64 42 75  Handler *savedBu
1b3c0 73 79 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 64  sy;     /* Saved
1b3d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 62 75 73   copy of the bus
1b3e0 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  y handler */.  i
1b3f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b400 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65  K;..  /* Acquire
1b410 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61   the memory-mana
1b420 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a  gement mutex.  *
1b430 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69  /.  mutex = sqli
1b440 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1b450 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1b460 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c  TIC_MEM2);.  sql
1b470 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1b480 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  (mutex);..  /* S
1b490 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62 61  ignal all databa
1b4a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1b4b0 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67  hat memory manag
1b4c0 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a  ement wants.  **
1b4d0 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 20   to have access 
1b4e0 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e 0a 20  to the pagers.. 
1b4f0 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72   */.  for(pPager
1b500 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  =sqlite3PagerLis
1b510 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65  t; pPager; pPage
1b520 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29  r=pPager->pNext)
1b530 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  {.     pPager->i
1b540 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d  InUseMM = 1;.  }
1b550 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1b560 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65  QLITE_OK && (nRe
1b570 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
1b580 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20 50 67  <nReq) ){.    Pg
1b590 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 50 67  Hdr *pPg;.    Pg
1b5a0 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a  Hdr *pRecycled;.
1b5b0 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20   .    /* Try to 
1b5c0 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  find a page to r
1b5d0 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f 65 73  ecycle that does
1b5e0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 73   not require a s
1b5f0 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ync(). If.    **
1b600 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73   this is not pos
1b610 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20  sible, find one 
1b620 74 68 61 74 20 64 6f 65 73 20 72 65 71 75 69 72  that does requir
1b630 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20 20 20  e a sync()..    
1b640 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  */.    sqlite3_m
1b650 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1b660 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1b670 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1b680 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70 50  IC_LRU));.    pP
1b690 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61  g = sqlite3LruPa
1b6a0 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
1b6b0 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ced;.    while( 
1b6c0 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65 65  pPg && (pPg->nee
1b6d0 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50  dSync || pPg->pP
1b6e0 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29 20  ager->iInUseDB) 
1b6f0 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  ){.      pPg = p
1b700 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b  Pg->gfree.pNext;
1b710 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1b720 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50 67  pPg ){.      pPg
1b730 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67   = sqlite3LruPag
1b740 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20 20  eList.pFirst;.  
1b750 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26      while( pPg &
1b760 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69  & pPg->pPager->i
1b770 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20 20  InUseDB ){.     
1b780 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1b790 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ree.pNext;.     
1b7a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1b7b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b7c0 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
1b7d0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b7e0 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
1b7f0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d  .    /* If pPg==
1b800 30 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 63  0, then the bloc
1b810 6b 20 61 62 6f 76 65 20 68 61 73 20 66 61 69 6c  k above has fail
1b820 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ed to find a pag
1b830 65 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79  e to.    ** recy
1b840 63 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  cle. In this cas
1b850 65 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2d  e return early -
1b860 20 6e 6f 20 66 75 72 74 68 65 72 20 6d 65 6d 6f   no further memo
1b870 72 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ry will.    ** b
1b880 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20  e released..    
1b890 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 20  */.    if( !pPg 
1b8a0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50  ) break;..    pP
1b8b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1b8c0 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21  er;.    assert(!
1b8d0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1b8e0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1b8f0 75 2e 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61  u.pFirst);.    a
1b900 73 73 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53  ssert(pPg->needS
1b910 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67  ync || pPg==pPag
1b920 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
1b930 6e 63 65 64 29 3b 0a 20 20 0a 20 20 20 20 73 61  nced);.  .    sa
1b940 76 65 64 42 75 73 79 20 3d 20 70 50 61 67 65 72  vedBusy = pPager
1b950 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->pBusyHandler;.
1b960 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
1b970 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20  yHandler = 0;.  
1b980 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
1b990 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52  ycle(pPager, &pR
1b9a0 65 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 70 50  ecycled);.    pP
1b9b0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1b9c0 65 72 20 3d 20 73 61 76 65 64 42 75 73 79 3b 0a  er = savedBusy;.
1b9d0 20 20 20 20 61 73 73 65 72 74 28 70 52 65 63 79      assert(pRecy
1b9e0 63 6c 65 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21  cled==pPg || rc!
1b9f0 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20  =SQLITE_OK);.   
1ba00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  OK ){.      /* W
1ba20 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67  e've found a pag
1ba30 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68  e to free. At th
1ba40 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67  is point the pag
1ba50 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20  e has been .    
1ba60 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f    ** removed fro
1ba70 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d  m the page hash-
1ba80 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74  table, free-list
1ba90 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74   and synced-list
1baa0 20 0a 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72   .      ** (pFir
1bab0 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73  stSynced). It is
1bac0 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c   still in the al
1bad0 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c  l pages (pAll) l
1bae0 69 73 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52  ist. .      ** R
1baf0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
1bb00 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66  is list before f
1bb10 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a  reeing..      **
1bb20 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20  .      ** Todo: 
1bb30 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e  Check the Pager.
1bb40 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61  pStmt list to ma
1bb50 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
1bb60 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 2a 2a  Ok. It .      **
1bb70 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f   probably is tho
1bb80 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
1bb90 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b      PgHdr *pTmp;
1bba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bbb0 50 67 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg );.      if( 
1bbc0 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pPg==pPager->pAl
1bbd0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 50  l ){.         pP
1bbe0 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
1bbf0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
1bc00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bc10 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65   for( pTmp=pPage
1bc20 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70  r->pAll; pTmp->p
1bc30 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54  NextAll!=pPg; pT
1bc40 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  mp=pTmp->pNextAl
1bc50 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 54  l ){}.        pT
1bc60 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  mp->pNextAll = p
1bc70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
1bc80 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 6c      }.      nRel
1bc90 65 61 73 65 64 20 2b 3d 20 28 0a 20 20 20 20 20  eased += (.     
1bca0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67       sizeof(*pPg
1bcb0 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
1bcc0 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 2b  Size.          +
1bcd0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1bce0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1bcf0 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a          + MEMDB*
1bd00 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
1bd10 29 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ) .      );.    
1bd20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
1bd30 45 45 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70  EE %p %d *\n", p
1bd40 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1bd50 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
1bd60 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1bd70 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
1bd80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1bd90 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29  free(pPg->pData)
1bda0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1bdb0 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
1bdc0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
1bdd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bde0 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
1bdf0 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
1be00 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
1be10 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
1be20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1be30 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  in pager_recycle
1be40 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73  (). The error is
1be50 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f   not returned to
1be60 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
1be70 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
1be80 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
1be90 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
1bea0 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
1beb0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72  .      ** The er
1bec0 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
1bed0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
1bee0 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74   (or users, in t
1bef0 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 2a  he case .      *
1bf00 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
1bf10 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
1bf20 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
1bf30 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
1bf40 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
1bf50 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20      assert(.    
1bf60 20 20 20 20 20 20 28 72 63 26 30 78 66 66 29 3d        (rc&0xff)=
1bf70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
1bf80 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53  .          rc==S
1bf90 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
1bfa0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
1bfb0 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 29 3b  TE_BUSY.      );
1bfc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bfd0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1bfe0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1bff0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
1c000 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1c010 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
1c020 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79 20  lear the memory 
1c030 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67 73  management flags
1c040 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1c050 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f   mutex.  */.  fo
1c060 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33  r(pPager=sqlite3
1c070 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65  PagerList; pPage
1c080 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72  r; pPager=pPager
1c090 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70  ->pNext){.     p
1c0a0 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20  Pager->iInUseMM 
1c0b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1c0c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
1c0d0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  utex);..  /* Ret
1c0e0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1c0f0 66 20 62 79 74 65 73 20 72 65 6c 65 61 73 65 64  f bytes released
1c100 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  .  */.  return n
1c110 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
1c120 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1c130 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1c140 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
1c150 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1c160 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74   of page pPg out
1c170 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1c180 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1c190 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1c1a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1c1b0 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20  gHdr *pPg, Pgno 
1c1c0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pgno){.  int rc;
1c1d0 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20  .  i64 offset;. 
1c1e0 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
1c1f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  0 );.  assert(pP
1c200 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1c210 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
1c220 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50  File);.  if( !pP
1c230 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1c240 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ds ){.    return
1c250 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1c260 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20  ORT_READ;.  }.  
1c270 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
1c280 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1c290 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
1c2a0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1c2b0 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
1c2c0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1c2d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1c2e0 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52  offset);.  PAGER
1c2f0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1c300 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1c310 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1c320 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1c330 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1c340 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1c350 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  r, pgno));.  if(
1c360 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1c370 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1c380 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
1c390 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  8*)PGHDR_TO_DATA
1c3a0 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20  (pPg))[24],.    
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1c3e0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1c3f0 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44  ers));.  }.  COD
1c400 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC1(pPager, PGHD
1c410 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1c420 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
1c430 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45   PAGERTRACE4("FE
1c440 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1c450 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1c470 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1c480 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
1c490 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20  agehash(pPg));. 
1c4a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1c4b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c4c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1c4d0 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
1c4e0 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
1c4f0 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
1c500 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
1c510 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1c520 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
1c530 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
1c540 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
1c550 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1c560 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1c570 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  ** Immediately a
1c580 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74  fter obtaining t
1c590 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28  he shared lock (
1c5a0 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68  if required), th
1c5b0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  is function.** c
1c5c0 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d  hecks for a hot-
1c5d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
1c5e0 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61   one is found, a
1c5f0 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
1c600 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f  back.** is perfo
1c610 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rmed immediately
1c620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c630 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
1c640 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1c650 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c660 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 48 6f  E_OK;.  int isHo
1c670 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
1c680 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
1c690 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63 6c   opened for excl
1c6a0 75 73 69 76 65 20 61 63 63 65 73 73 2c 20 68 61  usive access, ha
1c6b0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1c6c0 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66 65   .  ** page refe
1c6d0 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e  rences and is in
1c6e0 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   an error-state,
1c6f0 20 6e 6f 77 20 69 73 20 74 68 65 20 63 68 61 6e   now is the chan
1c700 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a  ce to clear.  **
1c710 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63   the error. Disc
1c720 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
1c730 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
1c740 63 68 65 20 61 6e 64 20 74 72 65 61 74 20 61 6e  che and treat an
1c750 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72  y.  ** open jour
1c760 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68 6f  nal file as a ho
1c770 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t-journal..  */.
1c780 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
1c790 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1c7a0 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
1c7b0 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 50 61 67  >nRef==0 && pPag
1c7c0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1c7d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1c7e0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1c7f0 20 20 20 20 69 73 48 6f 74 20 3d 20 31 3b 0a 20      isHot = 1;. 
1c800 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 72     }.    pager_r
1c810 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c820 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1c830 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
1c840 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1c850 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
1c860 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
1c870 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
1c880 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
1c890 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
1c8a0 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
1c8b0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1c8c0 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
1c8d0 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
1c8e0 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
1c8f0 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
1c900 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
1c910 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1c920 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
1c930 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
1c940 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
1c950 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1c960 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
1c970 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1c980 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1c990 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20  || isHot ){.    
1c9a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c9b0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1c9c0 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
1c9d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c9e0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
1c9f0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
1ca00 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1ca10 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
1ca20 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1ca30 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
1ca40 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
1ca50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ca60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ca70 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
1ca80 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1ca90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1caa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1cab0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
1cac0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
1cad0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
1cae0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
1caf0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
1cb00 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
1cb10 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
1cb20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1cb30 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
1cb40 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
1cb50 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
1cb60 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
1cb70 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  /.      rc = has
1cb80 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
1cb90 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1cba0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  <0 ){.        re
1cbb0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1cbc0 28 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  (pPager, SQLITE_
1cbd0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  IOERR_NOMEM);.  
1cbe0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1cbf0 72 63 3d 3d 31 20 7c 7c 20 69 73 48 6f 74 20 29  rc==1 || isHot )
1cc00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  {.        /* Get
1cc10 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1cc20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1cc30 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
1cc40 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
1cc50 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
1cc60 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
1cc70 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
1cc80 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
1cc90 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
1cca0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1ccb0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
1ccc0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1ccd0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
1cce0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
1ccf0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
1cd00 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
1cd10 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
1cd20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
1cd30 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
1cd40 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
1cd50 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
1cd60 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
1cd70 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   it .        ** 
1cd80 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1cd90 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63   .        ** Bec
1cda0 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
1cdb0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
1cdc0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
1cdd0 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20  sted, the.      
1cde0 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
1cdf0 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
1ce00 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
1ce10 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
1ce20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62  to.        ** ob
1ce30 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
1ce40 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1ce50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ce60 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1ce70 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1ce80 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
1ce90 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
1cea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ceb0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1cec0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1ced0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1cee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  {.            pa
1cf00 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
1cf10 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1cf20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
1cf30 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1cf40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cf50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1cf60 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1cf70 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20 7d  USIVE;.        }
1cf80 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
1cf90 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1cfa0 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
1cfb0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1cfc0 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20  BUSY if.        
1cfd0 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
1cfe0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
1cff0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
1d000 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1d010 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1d020 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  le does not need
1d030 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74   to be locked it
1d040 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20  self.  The.     
1d050 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1d060 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
1d070 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
1d080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1d090 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  olds.        ** 
1d0a0 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
1d0b0 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
1d0c0 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
1d0d0 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
1d0e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
1d0f0 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
1d100 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
1d110 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ime..        **.
1d120 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
1d130 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
1d140 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
1d150 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
1d160 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a  se in .        *
1d170 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
1d180 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
1d190 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
1d1a0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
1d1b0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  d.        ** pos
1d1c0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
1d1d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
1d1e0 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
1d1f0 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
1d200 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
1d210 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
1d220 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1d230 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
1d240 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ires.        ** 
1d250 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
1d260 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
1d270 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1d280 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20   !isHot ){.     
1d290 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73       int res = s
1d2a0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1d2b0 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
1d2c0 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
1d2d0 53 53 5f 45 58 49 53 54 53 29 3b 0a 20 20 20 20  SS_EXISTS);.    
1d2e0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 31        if( res==1
1d2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d300 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
1d310 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
1d320 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1d330 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1d340 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1d350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
1d360 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1d370 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
1d380 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d390 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1d3a0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1d3b0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
1d3c0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
1d3d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1d3e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1d3f0 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
1d400 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20  hods );.        
1d410 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c      if( fout&SQL
1d420 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1d430 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
1d440 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1d450 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  USY;.           
1d460 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
1d470 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
1d480 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d490 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d4a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1d4b0 28 72 65 73 3d 3d 30 3f 53 51 4c 49 54 45 5f 42  (res==0?SQLITE_B
1d4c0 55 53 59 3a 53 51 4c 49 54 45 5f 49 4f 45 52 52  USY:SQLITE_IOERR
1d4d0 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 20  _NOMEM);.       
1d4e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d4f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d510 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
1d520 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1d530 20 20 20 20 20 20 73 77 69 74 63 68 28 20 72 63        switch( rc
1d540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d550 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
1d560 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  M:.            c
1d570 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
1d580 5f 55 4e 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  _UNLOCK:.       
1d590 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1d5a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 0a 20 20  _IOERR_NOMEM:.  
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1d5c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1d5d0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1d5e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d5f0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d610 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
1d620 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1d630 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
1d640 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1d650 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
1d660 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d670 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
1d680 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
1d690 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
1d6a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1d6b0 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20  dr = 0;. .      
1d6c0 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
1d6d0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
1d6e0 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
1d6f0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
1d700 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61         ** lock a
1d710 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
1d720 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
1d730 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
1d740 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1d750 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
1d760 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d780 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
1d790 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1d7a0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
1d7b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1d7c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1d7d0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
1d7e0 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
1d7f0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1d800 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
1d810 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
1d820 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1d830 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
1d840 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
1d850 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
1d860 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
1d870 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
1d880 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d890 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
1d8a0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
1d8b0 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
1d8c0 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
1d8d0 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
1d8e0 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
1d8f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
1d900 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
1d910 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
1d920 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62          ** has b
1d930 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
1d940 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
1d950 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
1d960 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  h the.        **
1d970 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20   cache..        
1d980 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61  **.        ** Da
1d990 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
1d9a0 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
1d9b0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
1d9c0 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
1d9d0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
1d9e0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
1d9f0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
1da00 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
1da10 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
1da20 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
1da30 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
1da40 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
1da50 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
1da60 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
1da70 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
1da80 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
1da90 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
1daa0 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65         ** a code
1dab0 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
1dac0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
1dad0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
1dae0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
1daf0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
1db00 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
1db10 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  e .        ** de
1db20 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
1db30 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
1db40 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
1db50 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
1db60 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
1db70 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
1db80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1db90 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
1dba0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1dbb0 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
1dbc0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1dbd0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1dbe0 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r);..        if(
1dbf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1dc00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1dc10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1dc20 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Code;.        }.
1dc30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1dc40 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
1dc50 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
1dc60 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
1dc70 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
1dc80 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
1dc90 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
1dca0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1dcb0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
1dcc0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1dcd0 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
1dce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1dcf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dd00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1dd10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1dd20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1dd30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
1dd40 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
1dd50 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
1dd60 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20  eVers));.       
1dd70 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
1dd80 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
1dd90 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1dda0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
1ddb0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
1ddc0 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
1ddd0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1dde0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ddf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1de00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  rt( pPager->excl
1de10 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
1de20 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45  ger->state<=PAGE
1de30 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
1de40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1de50 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1de60 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1de70 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1de80 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
1de90 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1dea0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1deb0 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e   a PgHdr object.
1dec0 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65     Either create
1ded0 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65   a new one or re
1dee0 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69  use.** an existi
1def0 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e  ng one that is n
1df00 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  ot otherwise in 
1df10 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  use..**.** A new
1df20 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
1df30 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61   is created if a
1df40 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
1df50 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a  ing are.** true:
1df60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
1df70 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65  We have not exce
1df80 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d  eded our maximum
1df90 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65   allocated cache
1dfa0 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20   size.**        
1dfb0 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20    as set by the 
1dfc0 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
1dfd0 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ze" command..**.
1dfe0 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
1dff0 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20  e are no unused 
1e000 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76  PgHdr objects av
1e010 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20  ailable at this 
1e020 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  time..**.**     
1e030 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20  (3)  This is an 
1e040 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1e050 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  se..**.**     (4
1e060 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
1e070 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68  PgHdr objects th
1e080 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  at do not requir
1e090 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  e a journal.**  
1e0a0 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e          file syn
1e0b0 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20  c and a sync of 
1e0c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1e0d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1e0e0 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62            prohib
1e0f0 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ited..**.** Othe
1e100 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20  rwise, reuse an 
1e110 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20  existing PgHdr. 
1e120 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1e130 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69   reuse an.** exi
1e140 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61  sting PgHdr if a
1e150 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
1e160 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
1e170 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20  .**     (1)  We 
1e180 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20  have reached or 
1e190 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78  exceeded the max
1e1a0 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a  imum cache size.
1e1b0 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f  **          allo
1e1c0 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63  wed by "PRAGMA c
1e1d0 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a  ache_size"..**.*
1e1e0 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
1e1f0 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69   is a PgHdr avai
1e200 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72  lable with PgHdr
1e210 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20  ->nRef==0.**.** 
1e220 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20      (3)  We are 
1e230 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d  not in an in-mem
1e240 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a  ory database.**.
1e250 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68  **     (4)  Eith
1e260 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  er there is an a
1e270 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74  vailable PgHdr t
1e280 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
1e290 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f  d.**          to
1e2a0 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69   be synced to di
1e2b0 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20  sk or else disk 
1e2c0 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65  syncing is curre
1e2d0 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
1e2e0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61   allowed..*/.sta
1e2f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c  tic int pagerAll
1e300 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20  ocatePage(Pager 
1e310 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1e320 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63  *ppPg){.  int rc
1e330 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e340 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
1e350 74 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20 2f  t nByteHdr;..  /
1e360 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50  * Create a new P
1e370 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74  gHdr if any of t
1e380 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f  he four conditio
1e390 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a  ns defined .  **
1e3a0 20 61 62 6f 76 65 20 61 72 65 20 6d 65 74 3a 20   above are met: 
1e3b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1e3c0 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
1e3d0 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67  xPage.   || pPag
1e3e0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d  er->lru.pFirst==
1e3f0 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20  0 .   || MEMDB. 
1e400 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72    || (pPager->lr
1e410 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  u.pFirstSynced==
1e420 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e  0 && pPager->doN
1e430 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20  otSync).  ){.   
1e440 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
1e450 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
1e460 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61  age>=pPager->nHa
1e470 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  sh ){.      page
1e480 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61  r_resize_hash_ta
1e490 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20  ble(pPager,.    
1e4a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61       pPager->nHa
1e4b0 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70  sh<256 ? 256 : p
1e4c0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b  Pager->nHash*2);
1e4d0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1e4e0 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20  r->nHash==0 ){. 
1e4f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1e500 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1e510 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1e520 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20  ocate_out;.     
1e530 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
1e540 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1e550 0a 20 20 20 20 6e 42 79 74 65 48 64 72 20 3d 20  .    nByteHdr = 
1e560 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 73  sizeof(*pPg) + s
1e570 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
1e580 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
1e590 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
1e5a0 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
1e5b0 72 79 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73  ry);.    pPg = s
1e5c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
1e5d0 42 79 74 65 48 64 72 20 29 3b 0a 20 20 20 20 69  ByteHdr );.    i
1e5e0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
1e5f0 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  pData = sqlite3_
1e600 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  malloc( pPager->
1e610 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
1e620 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29    if( pData==0 )
1e630 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e640 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20  3_free(pPg);.   
1e650 20 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20       pPg = 0;.  
1e660 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e670 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
1e680 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d  r);.    if( pPg=
1e690 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1e6a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1e6b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
1e6c0 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
1e6d0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
1e6e0 50 67 2c 20 30 2c 20 6e 42 79 74 65 48 64 72 29  Pg, 0, nByteHdr)
1e6f0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 61 74 61  ;.    pPg->pData
1e700 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 70 50   = pData;.    pP
1e710 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
1e720 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
1e730 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
1e740 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72  pAll;.    pPager
1e750 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
1e760 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
1e770 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1e780 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78  /* Recycle an ex
1e790 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74 68  isting page with
1e7a0 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e   a zero ref-coun
1e7b0 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  t. */.    rc = p
1e7c0 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
1e7d0 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ger, &pPg);.    
1e7e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
1e7f0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  USY ){.      rc 
1e800 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  = SQLITE_IOERR_B
1e810 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
1e820 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e830 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
1e840 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1e850 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1e860 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e870 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
1e880 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
1e890 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
1e8a0 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72  Pg = pPg;..pager
1e8b0 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20  _allocate_out:. 
1e8c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e8d0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
1e8e0 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65  e have the conte
1e8f0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
1e900 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  If the page was.
1e910 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  ** previously ac
1e920 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
1e930 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74  ntent==1, then t
1e940 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a  he content was.*
1e950 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a  * just initializ
1e960 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74  ed to zeros inst
1e970 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61  ead of being rea
1e980 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
1e990 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20  But now we need 
1e9a0 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66  the real data of
1e9b0 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d  f of disk.  So m
1e9c0 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68  ake sure we.** h
1e9d0 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74  ave it.  Read it
1e9e0 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   in if we do not
1e9f0 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79   have it already
1ea00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ea10 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
1ea20 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
1ea30 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65   if( pPg->needRe
1ea40 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ad ){.    int rc
1ea50 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
1ea60 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20  g->pPager, pPg, 
1ea70 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1ea80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ea90 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  K ){.      pPg->
1eaa0 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
1eab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1eac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ead0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1eae0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1eaf0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
1eb00 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
1eb10 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
1eb20 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
1eb30 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
1eb40 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
1eb50 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
1eb60 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
1eb70 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
1eb80 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
1eb90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1eba0 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1ebb0 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
1ebc0 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
1ebd0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1ebe0 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
1ebf0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1ec00 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
1ec10 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
1ec20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
1ec30 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
1ec40 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
1ec50 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
1ec60 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
1ec70 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
1ec80 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
1ec90 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
1eca0 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
1ecb0 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
1ecc0 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
1ecd0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
1ece0 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
1ecf0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
1ed00 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
1ed10 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
1ed20 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
1ed30 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
1ed40 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1ed50 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1ed60 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
1ed70 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
1ed80 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
1ed90 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
1eda0 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
1edb0 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
1edc0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
1edd0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
1ede0 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
1edf0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
1ee00 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
1ee10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
1ee20 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
1ee30 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
1ee40 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
1ee50 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
1ee60 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
1ee70 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
1ee80 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
1ee90 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
1eea0 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
1eeb0 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
1eec0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
1eed0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
1eee0 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
1eef0 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
1ef00 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
1ef10 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
1ef20 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
1ef30 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
1ef40 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c  noContent is fal
1ef50 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
1ef60 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
1ef70 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
1ef80 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  k..** If noConte
1ef90 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
1efa0 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
1efb0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1efc0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
1efd0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
1efe0 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e  is time, so do n
1eff0 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61  ot do a disk rea
1f000 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  d.  Just fill in
1f010 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1f020 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e  tent with zeros.
1f030 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66    But mark the f
1f040 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65  act that we have
1f050 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a   not read the.**
1f060 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74   content by sett
1f070 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1f080 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61  edRead flag.  La
1f090 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73  ter on, if .** s
1f0a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f0b0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1f0c0 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20  this page or if 
1f0d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
1f0e0 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  ** called again 
1f0f0 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1f100 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  0, that means th
1f110 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  at the content i
1f120 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20  s needed.** and 
1f130 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68  the disk read sh
1f140 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
1f150 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
1f160 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
1f170 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1f180 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1f190 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1f1a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f1b0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1f1c0 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1f1d0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1f1e0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1f1f0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1f200 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1f210 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1f220 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1f230 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1f240 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1f250 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1f260 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1f270 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1f280 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1f290 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1f2a0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1f2b0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65  K || pPager->nRe
1f2c0 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29  f>0 || pgno==1 )
1f2d0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
1f2e0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
1f2f0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
1f300 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1f310 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
1f320 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1f330 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
1f340 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
1f350 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
1f360 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
1f370 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
1f380 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
1f390 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1f3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f3b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1f3c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
1f3d0 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
1f3e0 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
1f3f0 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
1f400 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1f410 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
1f420 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1f430 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1f440 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
1f450 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
1f460 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
1f470 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65  abase file. page
1f480 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73  rSharedLock() is
1f490 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a   a no-op if .  *
1f4a0 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63  * a database loc
1f4b0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
1f4c0 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  d..  */.  rc = p
1f4d0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
1f4e0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
1f4f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f500 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f510 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1f520 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1f530 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50  _UNLOCK );..  pP
1f540 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
1f550 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
1f560 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
1f570 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1f580 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
1f590 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1f5a0 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  he. */.    int n
1f5b0 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  Max;.    int h;.
1f5c0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1f5d0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
1f5e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c     rc = pagerAll
1f5f0 6f 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72  ocatePage(pPager
1f600 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
1f610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f620 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1f630 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  c;.    }..    pP
1f640 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
1f650 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
1f660 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65  DB || pgno>pPage
1f670 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20  r->stmtSize );. 
1f680 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1f690 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
1f6a0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
1f6b0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
1f6c0 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
1f6d0 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b  nc = 0;..    mak
1f6e0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1f6f0 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
1f700 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
1f710 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  f++;.    if( pPa
1f720 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
1f730 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
1f740 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
1f750 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
1f760 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
1f770 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20     }.    nMax = 
1f780 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1f790 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
1f7a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
1f7b0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
1f7c0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1f7d0 43 6f 64 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Code;.      sqli
1f7e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1f7f0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1f800 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1f810 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
1f820 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20  page with data, 
1f830 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e  either by readin
1f840 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1f850 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c  ase.    ** file,
1f860 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74   or by setting t
1f870 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74  he entire page t
1f880 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  o zero..    */. 
1f890 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
1f8a0 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
1f8b0 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20  | (noContent && 
1f8c0 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52  !pPager->alwaysR
1f8d0 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20  ollback) ){.    
1f8e0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
1f8f0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1f900 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f910 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1f920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f930 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_FULL;.      }
1f940 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
1f950 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1f960 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
1f970 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
1f980 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f  g->needRead = no
1f990 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
1f9a0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1f9b0 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
1f9c0 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
1f9d0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1f9e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f9f0 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1fa00 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c  age(pPager, pPg,
1fa10 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
1fa20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fa30 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1fa40 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1fa50 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
1fa60 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gno = 0;.       
1fa70 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1fa80 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1fa90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1faa0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e    }.      pPg->n
1fab0 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1fac0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
1fad0 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
1fae0 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
1faf0 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
1fb00 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
1fb10 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72  sh-1);.    asser
1fb20 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
1fb30 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
1fb40 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
1fb50 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
1fb60 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
1fb70 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
1fb80 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
1fb90 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
1fba0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
1fbb0 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
1fbc0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
1fbd0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
1fbe0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1fbf0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1fc00 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
1fc10 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1fc20 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1fc30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1fc40 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
1fc50 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
1fc60 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
1fc70 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1fc80 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
1fc90 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  1);.    PAGER_IN
1fca0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
1fcb0 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e  ;.    if( !noCon
1fcc0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
1fcd0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
1fce0 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20  tent(pPg);.     
1fcf0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1fd00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fd10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fd20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1fd30 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70   }.  *ppPage = p
1fd40 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
1fd50 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1fd60 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
1fd70 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1fd80 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
1fd90 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
1fda0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fdb0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
1fdc0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1fdd0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
1fde0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
1fdf0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
1fe00 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
1fe10 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
1fe20 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
1fe30 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1fe40 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
1fe50 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
1fe60 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
1fe70 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65    int rc;.  page
1fe80 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
1fe90 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
1fea0 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
1feb0 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
1fec0 65 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ent);.  pagerLea
1fed0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
1fee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1fef0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1ff00 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
1ff10 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
1ff20 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
1ff30 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
1ff40 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
1ff50 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1ff60 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
1ff70 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
1ff80 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
1ff90 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1ffa0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
1ffb0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
1ffc0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1ffd0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
1ffe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1fff0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
20000 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
20010 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
20020 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
20030 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
20040 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
20050 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
20060 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
20070 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
20080 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
20090 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
200a0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
200b0 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
200c0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
200d0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
200e0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
200f0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
20100 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
20110 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
20120 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
20130 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  );..  pagerEnter
20140 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
20150 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
20160 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
20170 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
20180 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67  er->pAll || pPag
20190 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
201a0 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  e );.  }else if(
201b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
201c0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
201d0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
201e0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   ){.    /* Do no
201f0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65  thing */.  }else
20200 20 69 66 28 20 28 70 50 67 20 3d 20 70 61 67 65   if( (pPg = page
20210 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
20220 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20   pgno))!=0 ){.  
20230 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
20240 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
20250 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
20260 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
20270 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
20280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
20290 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
202a0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
202b0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
202c0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
202d0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
202e0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
202f0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
20300 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
20310 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
20320 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
20330 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
20340 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
20350 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
20360 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20370 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
20380 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
20390 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
203a0 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
203b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
203c0 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
203d0 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
203e0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
203f0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67    pagerEnter(pPg
20400 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67  ->pPager);.  pPg
20410 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45  ->nRef--;..  CHE
20420 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
20430 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
20440 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
20450 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
20460 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
20470 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
20480 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
20490 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
204a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
204b0 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20  nRef==0 ){..    
204c0 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b  lruListAdd(pPg);
204d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
204e0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
204f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
20500 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70  estructor(pPg, p
20510 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20520 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
20530 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
20540 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
20550 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
20560 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
20570 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
20580 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
20590 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
205a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
205b0 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
205c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
205d0 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50  >nRef==0 && (!pP
205e0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
205f0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
20600 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
20610 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
20620 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
20630 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
20640 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
20650 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
20660 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20670 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
20680 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
20690 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
206a0 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
206b0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
206c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
206d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
206e0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
206f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
20700 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
20710 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
20720 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
20730 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
20740 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
20750 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
20760 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
20770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20780 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
20790 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
207a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
207b0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
207c0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61  >pVfs;.  int fla
207d0 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
207e0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
207f0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
20800 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
20810 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63  EATE);..  int rc
20820 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
20830 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
20840 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
20850 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
20860 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20870 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
20880 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20890 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
208a0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
208b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
208c0 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
208d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
208e0 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
208f0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
20900 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
20910 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
20920 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
20930 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67  ->dbSize);.  pag
20940 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
20950 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
20960 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
20970 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20980 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
20990 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
209a0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  ournal;.  }..  i
209b0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
209c0 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  ile ){.    flags
209d0 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
209e0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
209f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
20a00 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c 73  JOURNAL);.  }els
20a10 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  e{.    flags |= 
20a20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
20a30 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 0a  N_JOURNAL);.  }.
20a40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20a50 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
20a60 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  E.  rc = sqlite3
20a70 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
20a80 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
20a90 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
20aa0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
20ab0 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
20ac0 61 67 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73 65  ager).  );.#else
20ad0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20ae0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
20af0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
20b00 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
20b10 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  , 0);.#endif.  a
20b20 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20b30 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
20b40 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
20b50 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
20b60 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
20b70 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
20b80 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
20b90 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
20ba0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20bb0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
20bc0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
20bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
20be0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
20bf0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
20c00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
20c10 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
20c20 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
20c30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20c40 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
20c50 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
20c60 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
20c70 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
20c80 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
20c90 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
20ca0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
20cb0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
20cc0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
20cd0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
20ce0 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
20cf0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
20d00 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
20d10 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
20d20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
20d30 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
20d40 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
20d50 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
20d60 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
20d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20d80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20d90 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
20da0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
20db0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20dc0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
20dd0 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49  OMEM && rc!=SQLI
20de0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
20df0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
20e00 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
20e10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
20e20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20e30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20e40 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
20e50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20e60 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
20e70 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
20e80 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
20e90 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
20ea0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
20eb0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
20ec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20ed0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
20ee0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
20ef0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
20f00 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
20f10 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
20f20 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
20f30 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
20f40 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
20f50 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
20f60 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
20f70 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
20f80 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  erRollback() is 
20f90 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
20fa0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
20fb0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
20fc0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
20fd0 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61  gerUnref() is ca
20fe0 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
20ff0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
21000 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
21010 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
21020 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
21030 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
21040 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
21050 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
21060 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
21070 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
21080 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
21090 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
210a0 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
210b0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
210c0 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
210d0 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
210e0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
210f0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
21100 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
21110 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
21120 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
21130 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
21140 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
21150 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
21160 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
21170 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
21180 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
21190 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
211a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
211b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
211c0 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
211d0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
211e0 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
211f0 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
21200 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
21210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
21220 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
21230 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
21240 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
21250 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
21260 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
21270 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
21280 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
21290 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
212a0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
212b0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
212c0 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
212d0 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
212e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
212f0 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
21300 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
21310 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
21320 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
21330 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
21340 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
21350 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
21360 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
21370 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
21380 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
21390 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67  egin(DbPage *pPg
213a0 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20  , int exFlag){. 
213b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
213c0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
213d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
213e0 4f 4b 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  OK;.  pagerEnter
213f0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
21400 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
21410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21420 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
21430 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
21440 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
21450 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
21460 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21470 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
21480 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
21490 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
214a0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
214b0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
214c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
214d0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
214e0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
214f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
21500 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
21510 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
21520 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
21530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21540 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
21550 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
21560 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
21570 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
21580 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
21590 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
215a0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
215b0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
215c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
215d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
215e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
215f0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
21600 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ger);.        re
21610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
21620 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
21630 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
21640 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
21650 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
21660 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21670 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ger));.      if(
21680 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
21690 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
216a0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
216b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
216c0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
216d0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
216e0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
216f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21700 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
21710 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
21720 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
21730 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
21740 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
21750 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c  ve-access mode l
21760 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
21770 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
21780 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
21790 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
217a0 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
217b0 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
217c0 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
217d0 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
217e0 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
217f0 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
21800 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20  n and truncated 
21810 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20  to 0 bytes..    
21820 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
21830 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
21840 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
21850 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
21860 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
21870 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
21880 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
21890 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
218a0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
218b0 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
218c0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
218d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
218e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
218f0 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ate( pPager->dbS
21900 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67 65 72  ize );.    pager
21910 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
21920 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
21930 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  pInJournal ){.  
21940 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21950 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
21960 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
21970 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
21980 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
21990 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
219a0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
219b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
219c0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f  ert( !pPager->jo
219d0 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61  urnalOpen || pPa
219e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
219f0 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
21a00 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  OK );.  pagerLea
21a10 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
21a20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21a30 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69  * Make a page di
21a40 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69  rty.  Set its di
21a50 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64  rty flag and add
21a60 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79   it to the dirty
21a70 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  .** page list..*
21a80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
21a90 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70  keDirty(PgHdr *p
21aa0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
21ab0 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20  dirty==0 ){.    
21ac0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
21ad0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
21ae0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
21af0 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
21b00 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74   = pPager->pDirt
21b10 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  y;.    if( pPage
21b20 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  r->pDirty ){.   
21b30 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
21b40 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
21b50 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
21b60 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  Pg->pPrevDirty =
21b70 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
21b80 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  pDirty = pPg;.  
21b90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
21ba0 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43  a page clean.  C
21bb0 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62  lear its dirty b
21bc0 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74  it and remove it
21bd0 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72   from the.** dir
21be0 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ty page list..*/
21bf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
21c00 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50  eClean(PgHdr *pP
21c10 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
21c20 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d  irty ){.    pPg-
21c30 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
21c40 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20  if( pPg->pDirty 
21c50 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21c60 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50   pPg->pDirty->pP
21c70 72 65 76 44 69 72 74 79 3d 3d 70 50 67 20 29 3b  revDirty==pPg );
21c80 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72  .      pPg->pDir
21c90 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
21ca0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
21cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21cc0 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
21cd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21ce0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
21cf0 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b  ->pDirty==pPg );
21d00 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
21d10 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d  vDirty->pDirty =
21d20 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
21d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21d40 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
21d50 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20  er->pDirty==pPg 
21d60 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  );.      pPg->pP
21d70 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
21d80 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
21d90 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
21da0 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
21db0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20   as writeable.  
21dc0 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
21dd0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
21de0 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69  rnal .** if it i
21df0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
21e00 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ady.  This routi
21e10 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
21e20 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a  d before making.
21e30 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ** changes to a 
21e40 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
21e50 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
21e60 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
21e70 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65  d, the pager cre
21e80 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f  ates a new.** jo
21e90 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72  urnal and acquir
21ea0 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  es a RESERVED lo
21eb0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
21ec0 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45  se.  If the RESE
21ed0 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75  RVED.** lock cou
21ee0 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72  ld not be acquir
21ef0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
21f00 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
21f10 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61  BUSY.  The.** ca
21f20 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75  lling routine mu
21f30 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61  st check for tha
21f40 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61  t return value a
21f50 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
21f60 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61  t to.** change a
21f70 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74  ny page data unt
21f80 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  il this routine 
21f90 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
21fa0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
21fb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75  journal file cou
21fc0 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ld not be writte
21fd0 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  n because the di
21fe0 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74  sk is full,.** t
21ff0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
22000 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
22010 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e  FULL and does an
22020 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62   immediate rollb
22030 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73  ack..** All subs
22040 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74  equent write att
22050 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72  empts also retur
22060 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e  n SQLITE_FULL un
22070 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  til there.** is 
22080 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
22090 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f  3PagerCommit() o
220a0 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  r sqlite3PagerRo
220b0 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72  llback() to.** r
220c0 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
220d0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
220e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
220f0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48  oid *pData = PGH
22100 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
22110 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22120 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
22130 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22140 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
22150 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
22160 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
22170 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20  errCode ){ .    
22180 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
22190 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
221a0 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
221b0 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
221c0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
221d0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
221e0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
221f0 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
22200 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
22210 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70 72  this page was pr
22220 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65  eviously acquire
22230 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  d with noContent
22240 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  ==1, that means.
22250 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72    ** we didn't r
22260 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68  eally read in th
22270 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
22280 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e   page.  This can
22290 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f   happen.  ** (fo
222a0 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20  r example) when 
222b0 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
222c0 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  g moved to the f
222d0 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20  reelist.  But.  
222e0 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70  ** now we are (p
222f0 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74  erhaps) moving t
22300 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74  he page off of t
22310 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a  he freelist for.
22320 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77    ** reuse and w
22330 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
22340 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74  ts original cont
22350 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74  ent so that cont
22360 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ent.  ** can be 
22370 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
22380 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
22390 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20   So do the read 
223a0 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d  at this.  ** tim
223b0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  e..  */.  rc = p
223c0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
223d0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20  (pPg);.  if( rc 
223e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
223f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  ;.  }..  /* Mark
22400 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
22410 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
22420 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
22430 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
22440 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
22450 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
22460 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
22470 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50  /.  makeDirty(pP
22480 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  g);.  if( pPg->i
22490 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67  nJournal && (pag
224a0 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67  eInStatement(pPg
224b0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ) || pPager->stm
224c0 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
224d0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
224e0 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
224f0 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
22500 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
22510 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
22520 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
22530 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
22540 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
22550 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
22560 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
22570 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
22580 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
22590 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
225a0 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
225b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
225c0 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
225d0 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
225e0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
225f0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
22600 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
22610 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
22620 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
22630 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67  e3PagerBegin(pPg
22640 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
22650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22660 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22670 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
22680 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
22690 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
226a0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
226b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
226c0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
226d0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
226e0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
226f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
22700 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22710 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
22720 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
22730 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
22740 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
22750 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
22760 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
22770 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
22780 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
22790 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
227a0 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
227b0 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
227c0 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
227d0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
227e0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
227f0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
22800 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
22810 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
22820 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
22830 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
22840 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
22850 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22860 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
22870 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
22880 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42  Journal || MEMDB
22890 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
228a0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
228b0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
228c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
228d0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
228e0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
228f0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
22900 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
22910 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  er);.          P
22920 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52  AGERTRACE3("JOUR
22930 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
22940 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
22950 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
22960 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22970 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
22980 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
22990 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
229a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50  lite3_malloc( pP
229b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
229c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
229d0 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b  !pHist->pOrig ){
229e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
229f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22a00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22a10 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
22a20 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
22a30 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
22a40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22a50 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
22a60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
22a70 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
22a80 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
22a90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
22aa0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
22ab0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
22ac0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
22ad0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
22ae0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
22af0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
22b00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
22b10 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
22b20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
22b30 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
22b40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22b50 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
22b60 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
22b70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
22b80 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
22b90 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
22ba0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
22bb0 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
22bc0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
22bd0 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
22be0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22bf0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
22c00 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
22c10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67  >journalOff, pPg
22c20 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
22c30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22c60 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
22c70 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
22c80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22cb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22cc0 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f + 4);.        
22cd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
22ce0 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
22cf0 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20  ->pageSize+4;.  
22d00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22d30 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
22d40 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
22d50 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
22d60 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20  alOff, cksum);. 
22d70 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
22d80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
22d90 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
22da0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
22db0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
22dc0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
22dd0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22e00 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
22e10 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
22e20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
22e30 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
22e40 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
22e50 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
22e60 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  5("JOURNAL %d pa
22e70 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
22e80 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
22e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ea0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
22eb0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
22ec0 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72  >needSync, pager
22ed0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
22ee0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ..          /* A
22ef0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
22f00 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
22f10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
22f20 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   The .          
22f30 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
22f40 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
22f50 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
22f60 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20  above..         
22f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
22f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22f90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
22fa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
22fb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
22fc0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
22fd0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22fe0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
22ff0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
23000 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
23010 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
23020 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
23030 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
23040 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
23050 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
23060 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23070 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
23080 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
23090 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
230a0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  t(pPager->pInStm
230b0 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
230c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
230d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
230e0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
230f0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
23100 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
23110 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
23120 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41  Sync;.        PA
23130 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e  GERTRACE4("APPEN
23140 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
23150 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
23170 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
23180 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
23190 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  edSync);.      }
231a0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
231b0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
231c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
231d0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
231e0 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  }.      pPg->inJ
231f0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
23200 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
23210 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
23220 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
23230 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
23240 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
23250 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
23260 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
23270 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
23280 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
23290 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
232a0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
232b0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
232c0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
232d0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
232e0 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
232f0 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
23300 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
23310 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
23320 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
23330 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70 61  Use .     && !pa
23340 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
23350 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74  g) .     && (int
23360 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
23370 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20  er->stmtSize .  
23380 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
23390 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
233a0 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
233b0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
233c0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
233d0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
233e0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
233f0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
23400 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
23410 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
23420 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
23430 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
23440 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
23450 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50  lite3_malloc( pP
23460 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
23470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
23480 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
23490 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
234a0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
234b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
234c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
234d0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
234e0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
234f0 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
23500 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
23510 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
23520 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
23530 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
23540 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
23550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23560 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
23570 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
23580 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
23590 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
235a0 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20   char *pData2 = 
235b0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
235c0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
235d0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   7);.        rc 
235e0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
235f0 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73  ager->stfd, offs
23600 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
23610 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23630 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23640 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
23650 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c  r->stfd, pData2,
23660 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23670 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
23680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23690 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
236a0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
236b0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
236c0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
236d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
236e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
236f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
23700 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
23710 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
23720 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
23730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23740 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30  ager->pInStmt!=0
23750 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
23760 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
23770 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50  ger->pInStmt, pP
23780 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
23790 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
237a0 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
237b0 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
237c0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
237d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
237e0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
237f0 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
23800 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
23810 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
23820 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
23830 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
23840 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
23850 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
23860 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
23870 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
23880 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
23890 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
238a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
238b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
238c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
238d0 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
238e0 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
238f0 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
23900 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
23910 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
23920 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
23930 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
23940 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
23950 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
23960 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
23970 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
23980 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
23990 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
239a0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
239b0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
239c0 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
239d0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
239e0 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
239f0 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
23a00 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
23a10 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
23a20 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
23a30 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
23a40 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
23a50 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
23a60 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
23a70 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
23a80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23a90 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
23aa0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23ab0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
23ac0 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
23ad0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
23ae0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
23af0 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
23b00 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
23b10 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
23b20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
23b30 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
23b40 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45  ager);.  if( !ME
23b50 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53  MDB && nPagePerS
23b60 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
23b70 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
23b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
23b90 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
23ba0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
23bb0 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
23bc0 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
23bd0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
23be0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
23bf0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
23c00 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
23c10 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
23c20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23c30 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
23c40 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
23c50 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
23c60 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
23c70 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  c = 0;..    /* S
23c80 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
23c90 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
23ca0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
23cb0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
23cc0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
23cd0 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
23ce0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
23cf0 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
23d00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
23d10 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
23d20 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
23d30 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
23d40 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
23d50 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
23d60 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
23d70 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
23d80 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
23d90 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
23da0 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
23db0 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
23dc0 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
23dd0 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
23de0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
23df0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
23e00 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
23e10 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
23e20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
23e30 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
23e40 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
23e50 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
23e60 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65  geCount = sqlite
23e70 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
23e80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
23e90 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
23ea0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
23eb0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
23ec0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
23ed0 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
23ee0 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
23ef0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
23f00 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
23f10 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
23f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23f30 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
23f40 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
23f50 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
23f60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
23f70 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
23f80 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
23f90 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
23fa0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
23fb0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
23fc0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
23fd0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
23fe0 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
23ff0 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
24000 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
24010 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
24020 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
24030 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
24040 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
24050 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
24060 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
24070 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24080 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
24090 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
240a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
240b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
240c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
240d0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
240e0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
240f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
24100 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
24110 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
24120 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
24130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24140 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
24150 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
24160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24170 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
24180 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
24190 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
241a0 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
241b0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65     if( pPage->ne
241c0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
241d0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
241e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
241f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
24200 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e  * If the PgHdr.n
24210 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
24220 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
24230 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
24240 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
24250 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
24260 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
24270 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
24280 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
24290 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
242a0 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
242b0 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
242c0 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
242d0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
242e0 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
242f0 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
24300 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
24310 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
24320 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
24330 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
24340 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
24360 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
24370 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
24380 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e  nPage && needSyn
24390 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
243a0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
243b0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
243c0 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
243d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
243e0 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79   ) pPage->needSy
243f0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
24400 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
24410 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
24420 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
24430 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
24440 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
24450 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
24460 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
24470 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
24480 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
24490 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
244a0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
244b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
244c0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
244d0 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
244e0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
244f0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
24500 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
24510 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
24520 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
24530 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
24540 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
24550 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
24560 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
24570 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
24580 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
24590 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
245a0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
245b0 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23   pPg->dirty;.}.#
245c0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
245d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
245e0 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  M./*.** Replace 
245f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
24600 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
24610 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
24620 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
24630 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
24640 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
24650 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
24660 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
24670 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
24680 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
24690 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67 65   int rc;..  page
246a0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
246b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
246c0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
246d0 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  gno, &pPg);.  if
246e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
246f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
24700 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
24710 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
24720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24730 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
24740 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
24750 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  g), pData, pPage
24760 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
24770 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
24780 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
24790 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
247a0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
247b0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
247c0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
247d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
247e0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
247f0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
24800 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
24810 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
24820 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
24830 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
24840 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
24850 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
24860 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
24870 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
24880 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
24890 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
248a0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
248b0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
248c0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
248d0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
248e0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
248f0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
24900 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
24910 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
24920 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
24930 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
24940 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
24950 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
24960 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
24970 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
24980 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
24990 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
249a0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
249b0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
249c0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
249d0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
249e0 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
249f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
24a00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24a10 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
24a20 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
24a30 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
24a40 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
24a50 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
24a60 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  Rollback() for t
24a70 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
24a80 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
24a90 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
24aa0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
24ab0 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
24ac0 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
24ad0 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
24ae0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
24af0 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
24b00 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
24b10 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
24b20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
24b30 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
24b40 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
24b50 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
24b60 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
24b70 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
24b80 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
24b90 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
24ba0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
24bb0 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
24bc0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
24bd0 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
24be0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
24bf0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  ontRollback() ro
24c00 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
24c10 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
24c20 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  e.** page contai
24c30 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ns critical data
24c40 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
24c50 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
24c60 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ts.** rolled bac
24c70 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68  k in spite of th
24c80 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
24c90 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
24ca0 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
24cb0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
24cc0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
24cd0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
24ce0 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
24cf0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
24d00 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
24d10 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
24d20 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
24d30 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c  ager);.  pPg->al
24d40 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
24d50 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  ;.  if( pPg->dir
24d60 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73  ty && !pPager->s
24d70 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
24d80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24d90 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
24da0 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
24db0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
24dc0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
24dd0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
24de0 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
24df0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
24e00 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
24e10 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
24e20 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
24e30 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
24e40 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
24e50 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
24e60 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
24e70 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
24e80 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
24e90 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
24ea0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
24eb0 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
24ec0 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
24ed0 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
24ee0 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
24ef0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
24f00 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
24f10 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
24f20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
24f30 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
24f40 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
24f50 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
24f60 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
24f70 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
24f80 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
24f90 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
24fa0 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
24fb0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
24fc0 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
24fd0 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
24fe0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
24ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25000 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
25010 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
25020 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
25030 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
25040 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f  ager));.      IO
25050 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
25060 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
25070 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
25080 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
25090 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
250a0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
250b0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
250c0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
250d0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
250e0 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c    }.  }.  pagerL
250f0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  eave(pPager);.}.
25100 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
25110 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
25120 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
25130 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
25140 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
25150 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
25160 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
25170 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
25180 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
25190 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
251a0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
251b0 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
251c0 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
251d0 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
251e0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
251f0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
25200 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
25210 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
25220 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
25230 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
25240 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
25250 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25260 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
25270 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
25280 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
25290 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
252a0 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
252b0 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
252c0 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
252d0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
252e0 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  this point..**.*
252f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25300 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
25310 6f 6d 20 61 20 73 69 6e 67 6c 65 20 70 6c 61 63  om a single plac
25320 65 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 20  e in the sqlite 
25330 62 74 72 65 65 0a 2a 2a 20 63 6f 64 65 20 28 77  btree.** code (w
25340 68 65 6e 20 61 20 6c 65 61 66 20 69 73 20 72 65  hen a leaf is re
25350 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
25360 72 65 65 2d 6c 69 73 74 29 2e 20 54 68 69 73 20  ree-list). This 
25370 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 66 6f  allows the.** fo
25380 6c 6c 6f 77 69 6e 67 20 61 73 73 75 6d 70 74 69  llowing assumpti
25390 6f 6e 73 20 74 6f 20 62 65 20 6d 61 64 65 20 61  ons to be made a
253a0 62 6f 75 74 20 70 50 67 3a 0a 2a 2a 0a 2a 2a 20  bout pPg:.**.** 
253b0 20 20 31 2e 20 50 61 67 65 72 44 6f 6e 74 57 72    1. PagerDontWr
253c0 69 74 65 28 29 20 68 61 73 20 62 65 65 6e 20 63  ite() has been c
253d0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
253e0 65 2c 20 4f 52 20 0a 2a 2a 20 20 20 20 20 20 50  e, OR .**      P
253f0 61 67 65 72 57 72 69 74 65 28 29 20 68 61 73 20  agerWrite() has 
25400 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 61 6c  not yet been cal
25410 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  led on the page.
25420 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 20  .**.**   2. The 
25430 70 61 67 65 20 65 78 69 73 74 65 64 20 77 68 65  page existed whe
25440 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
25450 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 0a 2a  n was started..*
25460 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 20 44 6f  *.** Details: Do
25470 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 28 74 68  ntRollback() (th
25480 69 73 20 72 6f 75 74 69 6e 65 29 20 69 73 20 6f  is routine) is o
25490 6e 6c 79 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  nly called when 
254a0 61 20 6c 65 61 66 20 69 73 0a 2a 2a 20 72 65 6d  a leaf is.** rem
254b0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
254c0 65 65 20 6c 69 73 74 2e 20 44 6f 6e 74 57 72 69  ee list. DontWri
254d0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 77  te() is called w
254e0 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 0a  henever a page .
254f0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65  ** becomes a fre
25500 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 2a 2f 0a  e-list leaf..*/.
25510 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25520 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62  rDontRollback(Db
25530 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
25540 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
25550 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70 61  g->pPager;..  pa
25560 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
25570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25580 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
25590 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20  _RESERVED );..  
255a0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
255b0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  l file is not op
255c0 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74 65  en, or DontWrite
255d0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
255e0 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20  ed on.  ** this 
255f0 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65 28  page (DontWrite(
25600 29 20 73 65 74 73 20 74 68 65 20 61 6c 77 61 79  ) sets the alway
25610 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c  sRollback flag),
25620 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20   then this.  ** 
25630 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
25640 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
25650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
25660 70 65 6e 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 61  pen==0 || pPg->a
25670 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
25680 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
25690 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  ollback ){.    p
256a0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
256b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
256c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45   }.  assert( !ME
256d0 4d 44 42 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72  MDB );    /* For
256e0 20 61 20 6d 65 6d 64 62 2c 20 70 50 61 67 65 72   a memdb, pPager
256f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73  ->journalOpen is
25700 20 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a 20 20   always 0 */..  
25710 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 50 61  /* Check that Pa
25720 67 65 72 57 72 69 74 65 28 29 20 68 61 73 20 6e  gerWrite() has n
25730 6f 74 20 79 65 74 20 62 65 65 6e 20 63 61 6c 6c  ot yet been call
25740 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  ed on this page,
25750 20 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 74   and.  ** that t
25760 68 65 20 70 61 67 65 20 65 78 69 73 74 65 64 20  he page existed 
25770 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
25780 74 69 6f 6e 20 73 74 61 72 74 65 64 2e 0a 20 20  tion started..  
25790 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  */.  assert( !pP
257a0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
257b0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
257c0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
257d0 53 69 7a 65 20 29 3b 0a 0a 20 20 61 73 73 65 72  Size );..  asser
257e0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
257f0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71  urnal!=0 );.  sq
25800 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
25810 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
25820 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
25830 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
25840 3d 20 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65 64  = 1;.  pPg->need
25850 52 65 61 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  Read = 0;.  if( 
25860 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
25870 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
25880 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
25890 65 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  e <= pPager->ori
258a0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73  gDbSize );.    s
258b0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
258c0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
258d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
258e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
258f0 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
25900 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
25910 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
25920 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
25930 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45  OTRACE(("GARBAGE
25940 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
25950 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
25960 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
25970 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  er);.}.../*.** T
25980 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
25990 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
259a0 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
259b0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
259c0 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
259d0 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
259e0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
259f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
25a00 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
25a10 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
25a20 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 29  r, int isDirect)
25a30 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
25a40 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
25a50 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
25a60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
25a70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
25a80 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
25a90 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  {.    /* Open pa
25aa0 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
25ab0 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
25ac0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25ad0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
25ae0 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
25af0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25b00 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
25b10 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73 44 69  ;..    if( !isDi
25b20 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63  rect ){.      rc
25b30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25b40 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
25b50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25b60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25b80 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
25b90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25ba0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25bb0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
25bc0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
25bd0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
25be0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
25bf0 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63   */.    change_c
25c00 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
25c10 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
25c20 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
25c30 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  );.    change_co
25c40 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74  unter++;.    put
25c50 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50  32bits(((char*)P
25c60 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
25c70 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65  Hdr))+24, change
25c80 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
25c90 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26 20  if( isDirect && 
25ca0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
25cb0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f  hods ){.      co
25cc0 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
25cd0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
25ce0 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 72 63  PgHdr);.      rc
25cf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
25d00 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  e(pPager->fd, zB
25d10 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
25d20 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Size, 0);.    }.
25d30 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
25d40 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
25d50 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
25d60 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
25d70 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Hdr);.    pPager
25d80 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
25d90 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
25da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25db0 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
25dc0 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  file to disk..*/
25dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25de0 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
25df0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
25e00 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
25e10 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
25e20 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
25e30 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
25e40 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 70 61  ync_flags);.  pa
25e50 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
25e60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25e70 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
25e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
25e90 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
25ea0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
25eb0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
25ec0 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
25ed0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
25ee0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
25ef0 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
25f00 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
25f10 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
25f20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
25f30 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
25f40 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
25f50 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
25f60 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
25f70 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
25f80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
25f90 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
25fa0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
25fb0 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
25fc0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
25fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25fe0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
25ff0 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
26000 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
26010 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
26020 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
26030 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
26040 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
26050 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
26060 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
26070 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
26080 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
26090 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
260a0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
260b0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
260c0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
260d0 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
260e0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
260f0 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
26100 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
26110 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
26120 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
26130 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
26140 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
26150 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
26160 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
26170 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
26180 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
26190 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
261a0 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
261b0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
261c0 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
261d0 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
261e0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
261f0 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
26200 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
26210 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
26220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26230 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
26240 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
26250 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
26260 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
26270 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
26280 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26290 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
262a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
262b0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
262c0 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50 67 6e  *zMaster, .  Pgn
262d0 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74 20  o nTrunc,.  int 
262e0 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74 20  noSync.){.  int 
262f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26300 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
26310 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
26320 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
26330 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20  s nTrunc=%d\n", 
26340 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
26350 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
26360 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61  r, nTrunc);.  pa
26370 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
26380 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
26390 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
263a0 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
263b0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
263c0 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
263d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
263e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
263f0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
26400 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
26410 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
26420 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
26430 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
26440 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
26450 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23    PgHdr *pPg;..#
26460 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26470 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
26480 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d  .    /* The atom
26490 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
264a0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
264b0 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a  d if all of the.
264c0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
264d0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a   are true:.    *
264e0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  *.    **    + Th
264f0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
26500 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
26510 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
26520 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20   for.    **     
26530 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
26540 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20  page-size, and. 
26550 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20     **    + This 
26560 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61  commit is not pa
26570 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
26580 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  le transaction, 
26590 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  and.    **    + 
265a0 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  Exactly one page
265b0 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
265c0 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ed and store in 
265d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
265e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
265f0 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
26600 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c  ion can be used,
26610 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
26620 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65  l file will neve
26630 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61  r.    ** be crea
26640 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
26650 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  nsaction..    */
26660 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d  .    int useAtom
26670 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20  icWrite = (.    
26680 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20      !zMaster && 
26690 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
266a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
266b0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
266c0 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  er) && .        
266d0 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20  nTrunc==0 && .  
266e0 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67 65 72        (0==pPager
266f0 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70  ->pDirty || 0==p
26700 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
26710 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a 20 20  Dirty).    );.  
26720 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57    if( useAtomicW
26730 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rite ){.      /*
26740 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   Update the nRec
26750 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f   field in the jo
26760 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
26770 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20       int offset 
26780 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
26790 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
267a0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
267b0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
267c0 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20  r->nRec==1);.   
267d0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
267e0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
267f0 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d   offset, pPager-
26800 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f  >nRec);..      /
26810 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20  * Update the db 
26820 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
26830 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ter. The followi
26840 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
26850 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ify.      ** the
26860 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
26870 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67  sentation of pag
26880 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  e 1 to include t
26890 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 20  he updated.     
268a0 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74   ** change count
268b0 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  er and then writ
268c0 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74 6c  e page 1 directl
268d0 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
268e0 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e  e.      ** file.
268f0 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
26900 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
26910 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73  perty of the hos
26920 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a  t file-system, .
26930 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73        ** this is
26940 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   safe..      */.
26950 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26970 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
26980 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
26990 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
269a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
269b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
269c0 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
269d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
269e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73    }..    if( !us
269f0 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26 20  eAtomicWrite && 
26a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a  rc==SQLITE_OK ).
26a10 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
26a20 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
26a30 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
26a40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
26a50 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
26a60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
26a70 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
26a80 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
26a90 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
26aa0 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
26ab0 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
26ac0 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
26ad0 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
26ae0 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
26af0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
26b00 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
26b10 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
26b20 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
26b30 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
26b40 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
26b50 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
26b60 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
26b70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26b80 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
26b90 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
26ba0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
26bb0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
26bc0 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
26bd0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
26be0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
26bf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26c00 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
26c10 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  xit;.#ifndef SQL
26c20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
26c30 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54  UUM.      if( nT
26c40 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
26c50 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72     /* If this tr
26c60 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61  ansaction has ma
26c70 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
26c80 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c  smaller, then al
26c90 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20  l pages.        
26ca0 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
26cb0 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
26cc0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
26cd0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
26ce0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
26cf0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
26d00 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a          Pgno i;.
26d10 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69          int iSki
26d20 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
26d30 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  O(pPager);.     
26d40 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63     for( i=nTrunc
26d50 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f  +1; i<=pPager->o
26d60 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29  rigDbSize; i++ )
26d70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
26d80 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
26d90 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
26da0 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d  urnal, i) && i!=
26db0 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
26dc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26dd0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
26de0 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  , i, &pPg);.    
26df0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26e00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
26e10 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
26e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26e30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26e40 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
26e50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
26e60 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
26e70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26e80 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
26e90 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
26ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
26eb0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
26ec0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
26ed0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
26ee0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
26ef0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26f00 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
26f10 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
26f20 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
26f30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
26f40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26f50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
26f60 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20  _exit;..#ifndef 
26f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26f80 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
26f90 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
26fa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26fb0 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
26fc0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
26fd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26fe0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
26ff0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
27000 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
27010 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
27020 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
27030 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
27040 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
27050 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
27060 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
27070 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
27080 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
27090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
270a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
270b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
270c0 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
270d0 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72      /* The error
270e0 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66 74   might have left
270f0 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20   the dirty list 
27100 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68 65  all fouled up he
27110 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75 74  re,.      ** but
27120 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
27130 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69 66  atter because if
27140 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72 74   the if the dirt
27150 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20 20  y list did.     
27160 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65   ** get corrupte
27170 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e  d, then the tran
27180 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c  saction will rol
27190 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20 20  l back and.     
271a0 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65 20   ** discard the 
271b0 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68 65  dirty list.  The
271c0 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74 20  re is an assert 
271d0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  in.      ** page
271e0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
271f0 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65 72  pages() that ver
27200 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61 74  ifies that no at
27210 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20 69  tempt.      ** i
27220 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61 6e  s made to use an
27230 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20 6c   invalid dirty l
27240 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
27250 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78      goto sync_ex
27260 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  it;.    }.    pP
27270 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
27280 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
27290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
272a0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
272b0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
272c0 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
272d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
272e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
272f0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
27300 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  gs);.    }.    I
27310 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
27320 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
27330 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
27340 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
27350 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
27360 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
27370 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
27380 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
27390 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
273a0 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
273b0 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
273c0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
273d0 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
273e0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
273f0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
27400 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
27410 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
27420 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
27430 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
27440 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
27450 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
27460 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
27470 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
27480 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
27490 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a  nt, it is.     *
274a0 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
274b0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
274c0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
274d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
274e0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
274f0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
27500 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
27510 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
27520 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27530 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
27540 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
27550 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
27560 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
27570 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
27580 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
27590 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
275a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
275b0 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
275c0 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
275d0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
275e0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
275f0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
27600 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
27610 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
27620 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
27630 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
27640 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
27650 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
27660 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
27670 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
27680 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
27690 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
276a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61  _ERROR;.  }.  pa
276b0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
276c0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
276d0 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
276e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
276f0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
27700 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
27710 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
27720 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
27730 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
27740 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
27750 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
27760 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
27770 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48  r);.      clearH
27780 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
27790 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
277a0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
277b0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
277c0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
277d0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
277e0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
277f0 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50  .      pHist->pP
27800 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
27810 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
27820 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
27830 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
27840 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
27850 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e  y = 0;.#ifndef N
27860 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
27870 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
27880 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
27890 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
278a0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
278b0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
278c0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
278d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
278e0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
278f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
27900 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
27910 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27920 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
27930 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
27940 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
27950 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
27960 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
27970 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67 65  SHARED;.    page
27980 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
27990 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
279a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
279b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
279c0 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
279d0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
279e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
279f0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
27a00 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67  _SYNCED || !pPag
27a10 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
27a20 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
27a30 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
27a40 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
27a50 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
27a60 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
27a70 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
27a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27a90 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
27aa0 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
27ab0 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
27ac0 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
27ad0 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
27ae0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
27af0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
27b00 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
27b10 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
27b20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
27b30 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
27b40 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
27b50 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
27b60 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
27b70 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
27b80 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
27b90 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
27ba0 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
27bb0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
27bc0 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
27bd0 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
27be0 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
27bf0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
27c00 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
27c10 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
27c20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
27c30 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
27c40 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
27c50 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
27c60 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
27c70 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
27c80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27c90 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
27ca0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
27cb0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
27cc0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
27cd0 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
27ce0 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
27cf0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
27d00 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
27d10 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
27d20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
27d30 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
27d40 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
27d50 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
27d60 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
27d70 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
27d80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
27d90 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
27da0 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
27db0 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
27dc0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
27dd0 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
27de0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
27df0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
27e00 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
27e10 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
27e20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
27e30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27e40 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
27e50 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
27e60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
27e70 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
27e80 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
27e90 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
27ea0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
27eb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
27ec0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
27ed0 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
27ee0 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
27ef0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
27f00 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
27f10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
27f20 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45  AGERTRACE3("PAGE
27f30 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
27f40 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
27f50 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
27f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27f70 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
27f80 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
27f90 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
27fa0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
27fb0 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
27fc0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
27fd0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
27fe0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
27ff0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
28000 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
28010 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
28020 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
28030 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
28040 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
28050 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
28060 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
28070 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
28080 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
28090 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
280a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
280b0 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
280c0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
280d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
280e0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
280f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
28100 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
28110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28120 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 45  K;.  }..  pagerE
28130 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
28140 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
28150 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
28160 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
28170 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
28180 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
28190 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  n(pPager);.    p
281a0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
281b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
281c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
281d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
281e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
281f0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
28200 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28210 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
28220 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
28230 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
28240 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
28250 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
28260 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
28270 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
28280 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
28290 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
282a0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
282b0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
282c0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
282d0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
282e0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
282f0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
28300 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
28310 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28320 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
28330 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
28340 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
28350 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
28360 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  , 0);.  }.  /* p
28370 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
28380 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  r); */.  pPager-
28390 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  >dbSize = -1;.. 
283a0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
283b0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
283c0 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
283d0 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
283e0 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
283f0 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
28400 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
28410 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
28420 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
28430 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   ** persistent..
28440 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
28450 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
28460 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  rc);.  pagerLeav
28470 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
28480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28490 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
284a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
284b0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
284c0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
284d0 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
284e0 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
284f0 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
28500 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
28510 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
28520 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
28530 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
28540 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
28550 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
28560 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
28570 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
28580 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
28590 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
285a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
285b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52  eturn pPager->nR
285c0 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ef;.}..#ifdef SQ
285d0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
285e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
285f0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
28600 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
28610 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
28620 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
28630 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28640 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
28650 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
28660 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
28670 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
28680 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
28690 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
286a0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
286b0 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
286c0 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
286d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
286e0 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ode;.  a[6] = pP
286f0 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
28700 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
28710 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20  ss;.  a[8] = 0; 
28720 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70   /* Used to be p
28730 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a  Pager->nOvfl */.
28740 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
28750 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
28760 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
28770 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
28780 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
28790 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
287a0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
287b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
287c0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
287d0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
287e0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
287f0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
28800 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
28810 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
28820 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
28830 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
28840 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
28850 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
28860 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
28870 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
28880 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
28890 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
288a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
288b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
288c0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
288d0 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
288e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
288f0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
28900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28910 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
28920 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
28930 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
28940 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28950 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
28960 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
28970 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
28980 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
28990 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
289a0 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
289b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
289c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
289d0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
289e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
289f0 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
28a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28a10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
28a20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28a30 70 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c 65  pen );.  pagerLe
28a40 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ave(pPager);.  a
28a50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
28a60 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  InStmt==0 );.  p
28a70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d  Pager->pInStmt =
28a80 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
28a90 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
28aa0 69 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  ize);.  pagerEnt
28ab0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
28ac0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
28ad0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  t==0 ){.    /* s
28ae0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
28af0 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
28b00 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  LOCK); */.    re
28b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28b20 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
28b30 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
28b40 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
28b50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
28b60 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
28b70 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
28b80 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
28b90 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
28ba0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
28bb0 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
28bc0 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
28bd0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
28be0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
28bf0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
28c00 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
28c10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
28c20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
28c30 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
28c40 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
28c50 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
28c60 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
28c70 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
28c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28c90 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
28ca0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
28cb0 3e 73 74 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  >stfd, pPager->z
28cc0 53 74 6d 74 4a 72 6e 6c 2c 0a 20 20 20 20 20 20  StmtJrnl,.      
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
28cf0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
28d00 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
28d10 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62       goto stmt_b
28d20 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
28d30 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
28d40 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
28d50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
28d60 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
28d70 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
28d80 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
28d90 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
28da0 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
28db0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  f( pPager->pInSt
28dc0 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
28dd0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
28de0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b  Pager->pInStmt);
28df0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
28e00 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
28e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
28e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
28e30 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
28e40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
28e50 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
28e60 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
28e70 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
28e80 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
28e90 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
28ea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28eb0 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
28ec0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
28ed0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
28ee0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
28ef0 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  r){.  pagerEnter
28f00 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
28f10 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
28f20 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
28f30 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
28f40 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
28f50 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
28f60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28f70 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
28f80 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71  B ){.      /* sq
28f90 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
28fa0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
28fb0 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
28fc0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
28fd0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29  pPager->pInStmt)
28fe0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
28ff0 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  pInStmt = 0;.   
29000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
29010 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
29020 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
29030 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
29040 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
29050 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
29060 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
29070 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
29080 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
29090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
290a0 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
290b0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
290c0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
290d0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
290e0 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
290f0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
29100 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29110 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
29120 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
29130 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
29140 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
29150 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
29160 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
29170 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
29180 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
29190 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
291a0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
291b0 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   0;.  pagerLeave
291c0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
291d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
291e0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
291f0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
29200 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29210 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
29220 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
29230 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
29240 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
29250 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
29260 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
29270 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
29280 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
29290 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
292a0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
292b0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
292c0 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
292d0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
292e0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
292f0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
29300 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
29310 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
29320 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
29330 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
29340 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
29350 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
29360 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
29370 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
29380 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
29390 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
293a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
293b0 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
293c0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
293d0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
293e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
293f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
29400 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
29410 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
29420 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
29430 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
29440 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
29450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
29460 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
29470 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
29480 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
29490 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
294a0 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
294b0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
294c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
294d0 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
294e0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
294f0 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  0;.  pagerLeave(
29500 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
29510 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29520 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
29530 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
29540 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
29550 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
29560 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
29570 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
29580 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
29590 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
295a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
295b0 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
295c0 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
295d0 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
295e0 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
295f0 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
29600 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
29610 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
29620 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
29630 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
29640 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29650 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
29660 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
29670 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
29680 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
29690 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
296a0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
296b0 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
296c0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
296d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
296e0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
296f0 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
29700 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
29710 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
29720 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
29730 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
29740 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
29750 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29760 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
29770 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
29780 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
29790 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
297a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
297b0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
297c0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
297d0 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
297e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
297f0 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
29800 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
29810 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
29820 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
29830 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
29840 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
29850 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
29860 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
29870 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
29880 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
29890 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
298a0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
298b0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
298c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
298d0 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
298e0 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
298f0 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
29900 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
29910 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
29920 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
29930 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
29940 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
29950 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
29960 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
29970 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
29980 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
29990 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
299a0 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
299b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
299c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
299d0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
299e0 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
299f0 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
29a00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  le..**.** There 
29a10 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
29a20 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
29a30 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
29a40 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20  ated at.** pgno 
29a50 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70  (which we call p
29a60 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68  PgOld) though th
29a70 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77  at page is allow
29a80 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63  ed to be.** in c
29a90 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61  ache.  If the pa
29aa0 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63 61  ge previous loca
29ab0 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
29ac0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
29ad0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
29ae0 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
29af0 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
29b00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
29b10 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
29b20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
29b30 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
29b40 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
29b50 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
29b60 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
29b70 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
29b80 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
29b90 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
29ba0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
29bb0 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
29bc0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
29bd0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
29be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
29bf0 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
29c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
29c10 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
29c20 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
29c30 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
29c40 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
29c50 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
29c60 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
29c70 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
29c80 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
29c90 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
29ca0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
29cb0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
29cc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
29cd0 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
29ce0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
29cf0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
29d00 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
29d10 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
29d20 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a  Hdr *pPgOld;  /*
29d30 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
29d40 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
29d50 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
29d60 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
29d70 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
29d80 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
29d90 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
29da0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35  ;..  PAGERTRACE5
29db0 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
29dc0 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
29dd0 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
29de0 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
29df0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
29e00 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
29e10 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41  , pgno);.  IOTRA
29e20 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
29e30 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
29e40 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
29e50 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  ..  pager_get_co
29e60 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66  ntent(pPg);.  if
29e70 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
29e80 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
29e90 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
29ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
29eb0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
29ec0 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d  int)pgno>pPager-
29ed0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
29ee0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
29ef0 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
29f00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
29f10 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
29f20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
29f30 6f 6d 20 69 74 73 20 68 61 73 68 2d 63 68 61 69  om its hash-chai
29f40 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
29f50 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
29f60 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
29f70 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
29f80 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
29f90 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
29fa0 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
29fb0 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69  om its hash chai
29fc0 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
29fd0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
29fe0 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
29ff0 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
2a000 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
2a010 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
2a020 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
2a030 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
2a040 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
2a050 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64    */.  pPg->need
2a060 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f  Sync = 0;.  pPgO
2a070 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
2a080 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
2a090 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
2a0a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
2a0b0 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
2a0c0 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
2a0d0 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
2a0e0 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  ld);.    makeCle
2a0f0 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  an(pPgOld);.    
2a100 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
2a110 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
2a120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2a130 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
2a140 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a  ;.  }.  pPg->inJ
2a150 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
2a160 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
2a170 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
2a180 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e  gno);..  /* Chan
2a190 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
2a1a0 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
2a1b0 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
2a1c0 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
2a1d0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2a1e0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
2a1f0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
2a200 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
2a210 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
2a220 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
2a230 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
2a240 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
2a250 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
2a260 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
2a270 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
2a280 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
2a290 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
2a2a0 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
2a2b0 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
2a2c0 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
2a2d0 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
2a2e0 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
2a2f0 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
2a300 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
2a310 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
2a320 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
2a330 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
2a340 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2a350 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2a360 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
2a370 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
2a380 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
2a390 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
2a3a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
2a3b0 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
2a3c0 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
2a3d0 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
2a3e0 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
2a3f0 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
2a400 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 70 49  .    ** Pager.pI
2a410 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
2a420 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
2a430 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
2a440 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
2a450 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
2a460 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
2a470 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
2a480 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
2a490 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
2a4a0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61  .    ** If the a
2a4b0 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74  ttempt to load t
2a4c0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
2a4d0 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c   page-cache fail
2a4e0 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74  s, (due.    ** t
2a4f0 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  o a malloc() or 
2a500 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65  IO failure), cle
2a510 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68  ar the bit in th
2a520 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20  e pInJournal[]. 
2a530 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68     ** array. Oth
2a540 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70  erwise, if the p
2a550 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  age is loaded an
2a560 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20  d written again 
2a570 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74  in.    ** this t
2a580 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
2a590 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
2a5a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a5b0 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  le before.    **
2a5c0 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e   it is synced in
2a5d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2a5e0 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69  ile. This way, i
2a5f0 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a  t may end up in.
2a600 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
2a610 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62  al file twice, b
2a620 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ut that is not a
2a630 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a   problem..    **
2a640 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
2a650 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
2a660 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
2a670 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
2a680 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
2a690 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
2a6a0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
2a6b0 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
2a6c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
2a6d0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
2a6e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a6f0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
2a700 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a710 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2a720 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
2a730 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
2a740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a750 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
2a760 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
2a770 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50  & (int)needSyncP
2a780 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
2a790 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
2a7a0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
2a7b0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
2a7c0 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
2a7d0 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ncPgno);.      }
2a7e0 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76  .      pagerLeav
2a7f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2a800 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a810 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
2a820 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2a830 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63  pPgHdr->needSync
2a840 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
2a850 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
2a860 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70  .    makeDirty(p
2a870 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
2a880 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2a890 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61  gHdr);.  }..  pa
2a8a0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
2a8b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a8c0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
2a8d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2a8e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
2a8f0 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
2a900 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
2a910 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
2a920 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
2a930 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50  pPg){.  return P
2a940 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
2a950 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2a960 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2a970 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
2a980 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
2a990 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
2a9a0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
2a9b0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2a9c0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
2a9d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2a9e0 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
2a9f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2aa00 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2aa10 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
2aa20 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  ?PGHDR_TO_EXTRA(
2aa30 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b  pPg, pPager):0);
2aa40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
2aa50 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
2aa60 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
2aa70 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
2aa80 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
2aa90 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
2aaa0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
2aab0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2aac0 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
2aad0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2aae0 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
2aaf0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
2ab00 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
2ab10 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
2ab20 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
2ab30 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
2ab40 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
2ab50 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
2ab60 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
2ab70 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
2ab80 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
2ab90 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2aba0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
2abb0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
2abc0 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
2abd0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
2abe0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2abf0 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
2ac00 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
2ac10 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
2ac20 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
2ac30 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2ac50 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
2ac60 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
2ac70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2ac80 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
2ac90 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2aca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2acb0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2acc0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
2acd0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2ace0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
2acf0 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
2ad00 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
2ad10 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
2ad20 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
2ad30 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
2ad40 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2ad50 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
2ad60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
2ad70 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
2ad80 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64  iveMode;.}..#ifd
2ad90 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
2ada0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
2adb0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
2adc0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
2add0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
2ade0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2adf0 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
2ae00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ae10 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
2ae20 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
2ae30 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
2ae40 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
2ae50 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
2ae60 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2ae70 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2ae80 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
2ae90 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
2aea0 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
2aeb0 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
2aec0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
2aed0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
2aee0 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
2aef0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
2af00 20 2a 2f 0a                                       */.